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

可能重复:
!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)。

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

    谢谢!


    function(){} ();
    

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

    function() {}
    

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

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

    !function(){}();
    

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


    如果你有两个脚本:

    script1.js

    (function(){
    
    })()
    

    script2.js

    (function(){
    
    })()
    

    你连接它们,你会得到:

    (function(){
    
    })()
    (function(){
    
    })()
    

    这会导致错误,同时:

    !function(){
    
    }()
    !function(){
    
    }()
    

    不。


    ECMAScript语言规范第12.4节说:

    ExpressionStatement不能以function关键字开头,因为这可能会使其与FunctionDeclaration模糊不清。

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

    链接地址: http://www.djcxy.com/p/96899.html

    上一篇: What's the difference between function(){}() and !function(){}()

    下一篇: What does !function ($) { $(function(){ }) }(window.jQuery) do?