@色少10年前
03/13
23:40
;!function(){…}
目的是防止在minify合并行的时候由于前一行缺少分号导致错误 比如:
alert(1)
!function(){…}
合并后变成 alert(1)!function… 就syntax error了 加一个分号就好了;
================================================================= 延展一下: !function(){alert('aaa')}() // true +function(){alert('aaa')}() // NaN -function(){alert('aaa')}() // NaN ~function(){alert('aaa')}() // -1
因为这样的代码混淆了函数声明和函数调用,以这种方式声明的函数
1 | a |
,就应该以
1 | a(); |
的方式调用。
但是括号则不同,它将一个函数声明转化成了一个表达式,解析器不再以函数声明的方式处理函数a,而是作为一个函数表达式处理,也因此只有在程序执行到函数a时它才能被访问。所以,任何消除函数声明和函数表达式间歧义的方法,都可以被解析器正确识别。所以,赋值,逻辑,甚至是逗号,各种操作符都可以告诉解析器,这个不是函数声明,它是个函数表达式。并且,对函数一元运算可以算的上是消除歧义最快的方式,感叹号只是其中之一,如果不在乎返回值,这些一元运算都是有效的;
测试下()是性能最优。因此常用于 (function(){})();也叫:自执行函数表达式;
参考:
http://swordair.com/function-and-exclamation-mark/
http://suqing.iteye.com/blog/1981591
《Javascript高级程序设计(第3版)》 7.3 模仿块级作用域