function(){}()和!function(){}()之间有什么区别?

时间:2012-01-25 17:47:00

标签: javascript jquery twitter-bootstrap

  

可能重复:
  !function(){ }() vs (function(){ })()

所以我只是通过Twitter阅读新的Bootstrap(2.0)的来源,并注意到在自动调用匿名函数之前有一个感叹号。当我看到这个时,我立即想到“哦,废话,有一个新的,更好的方法来做到这一点?”。

亲自看看!

无论如何,有什么区别?必须有一个原因,因为它们在所有JavaScript插件中都使用它(对于Bootstrap)。

我注意到的另一件事就是“严格使用”。我不认为这与我之前的调查有关,但任何人都可以解释一下吗?

谢谢!

3 个答案:

答案 0 :(得分:14)

function(){} ();

本身(参见Point的评论)不会有效,因为

function() {}

是一个函数声明。要立即调用它,您需要让JavaScript引擎将该函数视为表达式。人们通常将此作为

中的任何一个
(function(){}) ();  //more common

(function(){} ()); // Papa Crockford's preference:

!function(){}();

简单地说是同一件事的速记版本。

答案 1 :(得分:8)

如果您有2个脚本:

script1.js

(function(){

})()

script2.js

(function(){

})()

你连接它们,你得到:

(function(){

})()
(function(){

})()

这会导致错误,而:

!function(){

}()
!function(){

}()

答案 2 :(得分:3)

ECMAScript Language Specification第12.4节说:

  

ExpressionStatement 无法启动   使用function关键字,因为那样   可能会使它变得模棱两可    FunctionDeclaration

因此,如果您需要一个执行匿名函数的表达式语句,则必须解决此限制。添加!(只是否定函数的结果)使解释器清楚它不是函数声明,避免了这种模糊性。