【问题标题】:JavaScript self-invoking functions [duplicate]JavaScript自调用函数[重复]
【发布时间】:2012-12-23 13:54:44
【问题描述】:

可能重复:
Difference between (function(){})(); and function(){}();
Are “(function ( ) { } ) ( )” and “(function ( ) { } ( ) )” functionally equal in JavaScript?

我只是想知道这两个示例之间是否有区别(关于功能):

第一个

(function foo() {
console.log("bar")
})()

第二次

(function foo() {
console.log("bar")
}())

两者似乎都可以正常工作......

谢谢!

【问题讨论】:

    标签: javascript self-invoking-function


    【解决方案1】:

    没有区别。其实你需要使用()只是因为简单...

    function() { console.log('bar'); } ();
    

    ... JS 解析器无法正确识别。如ES5 standard中所说:

    另外,ExpressionStatement 不能以 function 关键字开头 因为这可能会使 FunctionDeclaration 变得模棱两可。

    替代((...))解决方案是用一些一元运算符来扩充这个语句。两者都...

    +function() { console.log('bar'); } ();
    

    ...和...

    !function() { console.log('bar'); } ();
    

    ...会起作用的。

    【讨论】:

      【解决方案2】:

      它们完全一样。两者在效率、输出或使用方面没有任何区别。使用其中任何一个都是偏好问题。

      虽然 JS minfiers 常用的两种形式有一个较短的变体。也就是说,逻辑NOT-ing 函数表达式并调用它:

      !function() {
          console.log( x );
      }();​
      

      【讨论】:

        【解决方案3】:

        它们之间没有区别。两者都是immediately invoked function expressions。像 Douglas Crockford 这样的人更喜欢 second method。有些人更喜欢第一个。有趣的是,Crockford 的 JSLint 不允许第一种方法,所以我认为第二种方法更常见。

        哦,如果你使用函数声明而不是函数表达式,那么你可以在函数出现在程序中之前调用它。这是因为声明是在 JavaScript 中提升的:

        greet(); // This will work
        
        function greet() {
            alert("Merry Christmas!");
        }
        

        函数表达式不一样:

        greet(); // This will not work
        
        var greet = function greet() {
            alert("Merry Christmas!");
        };
        

        这就是你现在需要知道的所有内容。

        【讨论】:

        • function greet() 虽然有效,但没有意义。只需var greet = function () 即可。
        • @ErikE - 没有意义吗?这对我来说很有意义。
        • 不能使用的名称有什么意义?如果从不使用 greet 的话,它和 function () { var greet; } 一样有意义。
        • 对不起,我不清楚。 var greet = function greet () {} 就是我所说的。 See what I mean。在表达式的右侧给函数命名是没有用的。
        • @ErikE - 那是因为命名函数名称是局部变量。您只能从函数本身访问它们。但是,可以从包含范围访问函数声明名称,并且由于声明被提升,您可以在定义之前调用函数。
        猜你喜欢
        • 1970-01-01
        • 2017-04-01
        • 2012-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-29
        • 2013-08-29
        • 2018-03-22
        相关资源
        最近更新 更多