关于javascript:function(){}()和!function(){}()之间的区别是什么

What's the difference between function(){}() and !function(){}()

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
!function(){ }() vs (function(){ })()

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

你自己看!

  • http://markdotto.com/bs2/js/bootstrap-modal.js
  • http://markdotto.com/bs2/js/bootstrap-dropdown.js
  • http://markdotto.com/bs2/js/bootstrap-scrollspy.js
  • http://markdotto.com/bs2/js/bootstrap-popover.js
  • http://markdotto.com/bs2/js/bootstrap-tooltip.js
  • http://markdotto.com/bs2/js/bootstrap-tab.js

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

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

谢谢!


1
function(){} ();

从那时起(参见Point的评论)就不会有效了

1
function() {}

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

1
2
3
(function(){}) ();  //more common

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

1
!function(){}();

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


如果你有2个脚本:

script1.js

1
2
3
(function(){

})()

script2.js

1
2
3
(function(){

})()

你连接它们,你得到:

1
2
3
4
5
6
(function(){

})()
(function(){

})()

这会导致错误,而:

1
2
3
4
5
6
!function(){

}()
!function(){

}()

不。


ECMAScript语言规范第12.4节说:

An ExpressionStatement cannot start
with the function keyword because that
might make it ambiguous with a
FunctionDeclaration.

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