【问题标题】:Does parenthetical notation for self-invoked functions serve a purpose in Javascript? [duplicate]自调用函数的括号符号在 Javascript 中是否有用? [复制]
【发布时间】:2010-10-19 12:16:26
【问题描述】:

当我在 Javascript 中看到这样的自调用匿名函数示例时,我感到很困惑:

(function () { return val;}) ();

这个语法和下面的有区别吗:

function() { return val;} ();

如果有人能给我一个具体的区别,这将有助于解决困扰我多年的问题......

【问题讨论】:

    标签: javascript functional-programming scope


    【解决方案1】:

    Javascript 没有块作用域,因此这是一种创建不会污染全局命名空间的临时局部作用域的方法。括号有两个用途:

    1. 如果缺少 javascript 的某些实现,它们就会被淘汰。
    2. 它向读者表明正在发生与正常函数声明不同的事情。因此,作为一个约定,它表示这个函数被用作一个作用域。

    请看这里: http://peter.michaux.ca/articles/an-important-pair-of-parens

    【讨论】:

      【解决方案2】:

      在 Safari 4 中,以下代码(不带括号)导致“SyntaxError: Parse error”:

      function() { alert("Test"); }();
      

      ...但以下代码按预期工作:

      (function() { alert("Test"); })();
      

      更新:我还尝试了 Firefox 3 中的代码(通过 Firebug),它的行为就像 Safari。

      【讨论】:

        【解决方案3】:

        原因

        function() { return val;} ();
        

        不起作用是因为它是一个函数语句,而不是一个表达式。这是一个很小的区别,但基本上,如果语句以 function 开头,它就像一个 C 函数声明,你不能调用该函数,因为没有表达式值。

        添加括号使函数定义成为表达式的一部分,因此它有一个值并且可以被调用。

        赋值函数的返回值也消除了括号的需要,因为函数定义不是整个语句。例如,这些工作:

        var value = function() { alert("works"); return 0; }();
        (function() { alert("works"); })();
        

        但这不是:

        function() { alert("doesn't work"); }();
        

        我总是包含括号,即使它们不是必需的,因为这样更容易看出我正在调用函数,而不是将其分配给变量。

        【讨论】:

        【解决方案4】:

        据我所知,唯一的区别是后者有时不适用于某些 ECMAScript 风格(即 ActionScript,但可能还有其他)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多