【问题标题】:What's the difference between function(){}() and !function(){}() [duplicate]function(){}() 和 !function(){}() 有什么区别 [重复]
【发布时间】:2012-02-18 22:02:21
【问题描述】:

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

所以我刚刚从 Twitter 上阅读了新 Bootstrap (2.0) 的源代码,并注意到在自调用匿名函数之前有一个感叹号。当我看到这个时,我立刻想到“哦,废话,有一种新的、更好的方法来做到这一点?”。

自己看看吧!

无论如何,有什么区别?这一定是有原因的,因为他们在所有 JavaScript 插件(用于 Bootstrap)中始终使用它。

我注意到的另一件事是紧随其后的“use strict”。我认为这与我之前的询问无关,但谁能解释一下?

谢谢!

【问题讨论】:

    标签: javascript jquery twitter-bootstrap


    【解决方案1】:
    function(){} ();
    

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

    function() {}
    

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

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

    与

    !function(){}();
    

    只是同一事物的简写版本。

    【讨论】:

    • +1 虽然以后不是必需的,但符合 Doughlas Crackford 的良好做法 :)
    • @gdoron - 我现在被限制了。最好回去工作:)
    • 如果仅此而已,则第一个无效,但如果(例如)在它之前有 x = 之类的内容,则可以。
    • 谢谢!我还发现这个article 是由为 Bootstrap 编写 Javascript 的家伙写的。
    • @Johnny - 这是一篇很棒的文章,我必须保存它。虽然我不认为我是一个足够优秀的开发人员,可以摆脱这样的分号。你必须从里到外了解语言,才能知道什么时候会起作用,什么时候会咬你
    【解决方案2】:

    如果您有 2 个脚本:

    script1.js:

    (function(){
    
    })()
    

    script2.js:

    (function(){
    
    })()
    

    然后你将它们连接起来,你会得到:

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

    这会导致错误,而:

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

    没有。

    【讨论】:

    • 这也是一些脚本在开头使用分号的原因:;(function(){}())
    • 那么,可以肯定地说;(function(){}()) 和!function(){}() 有相同的用途吗?
    • 分号刚刚结束这一行。如果你不省略它,那么它不会引起问题。它与!function(){}(); 的用途不同
    【解决方案3】:

    ECMAScript Language Specification,第 12.4 节说:

    ExpressionStatement 无法启动 使用 function 关键字,因为 可能会使它变得模棱两可 函数声明.

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

    【讨论】:

      猜你喜欢
      • 2012-07-12
      • 1970-01-01
      • 2017-12-05
      • 2015-03-08
      • 2012-10-18
      • 1970-01-01
      • 2019-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多