前端学习

前端学习

@色少10年前

03/13
23:40
前端技能

;!function(){}的一些理解

;!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 模仿块级作用域

;!function(){}的一些理解