围绕对象/函数/类声明的括号是什么意思?

这个问题在这里已经有了答案:

  • 解释封装的匿名函数语法8个答案

  • 这是一个自我执行的匿名功能。 第一组圆括号包含要执行的表达式,第二组括号执行这些表达式。

    当试图从父命名空间隐藏变量时,这是一个有用的构造。 函数中的所有代码都包含在函数的私有范围内,这意味着它不能从函数外部访问,从而使其真正是私有的。

    看到:

    http://en.wikipedia.org/wiki/Closure_%28computer_science%29

    http://peter.michaux.ca/articles/javascript-namespacing


    安迪休谟几乎给出了答案,我只想补充一些细节。

    通过这个构造,您可以创建一个具有自己的评估环境或闭包的匿名函数,然后立即对其进行评估。 关于这一点的好处是可以访问在匿名函数之前声明的变量,并且可以在此函数内部使用局部变量而不会意外覆盖现有变量。

    var关键字的使用非常重要,因为在JavaScript中,每个变量默认都是全局变量,但是使用关键字创建一个新的,词法范围变量,也就是说, 两个大括号之间的代码可以看到它。 在你的例子中,你基本上是为YUI库中的对象创建简短的别名,但它具有更强大的用途。

    我不想离开你没有代码示例,所以我会在这里举一个简单的例子来说明关闭:

    var add_gen = function(n) {
      return function(x) {
        return n + x;
      };
    };
    var add2 = add_gen(2);
    add2(3); // result is 5
    

    这里发生了什么? 在函数add_gen中,您正在创建另一个函数,它将简单地将数字n添加到其参数中。 诀窍是,在函数参数列表中定义的变量充当词汇范围变量,就像使用var定义的变量一样。

    返回的函数在add_gen函数的大括号之间定义,所以即使在add_gen函数执行完成后,它也可以访问n的值,这就是为什么执行示例的最后一行时会得到5的原因。

    借助函数参数的词法范围,您可以解决在匿名函数中使用循环变量时产生的“问题”。 举一个简单的例子:

    for(var i=0; i<5; i++) {
      setTimeout(function(){alert(i)}, 10);
    }
    

    “预期”结果可能是从零到四的数字,但是您会得到四个五个实例。 发生这种情况是因为setTimeout和for循环中的匿名函数使用了非常相同的 i变量,所以当函数得到评估时,我将是5。

    您可以通过在您的问题中使用该技术和事实来获得天真的预期结果,即该函数参数在词汇范围内。 (我在其他答案中使用了这种方法)

    for(var i=0; i<5; i++) {
      setTimeout(
         (function(j) {
           return function(){alert(j)};
         })(i), 10);
    }
    

    通过对外部函数的即时评估,您将在每次迭代中创建一个名为j的完全独立变量,并将i的当前值复制到此变量中,以便您能够从第一次尝试中获得天真的结果。

    我建议您尝试了解http://ejohn.org/apps/learn/上的优秀教程,以更好地理解关闭,这是我非常了解的地方。


    ......但是围绕所有功能宣言的前一轮巡回演唱会呢?

    具体来说,它使JavaScript将'function(){...}'结构解释为内联匿名函数表达式。 如果您省略括号:

    function() {
        alert('hello');
    }();
    

    你会得到一个语法错误,因为JS解析器会看到'function'关键字,并假设你正在开始一个表单的函数声明:

    function doSomething() {
    }
    

    ...并且不能有没有函数名称的函数语句。

    函数表达式和函数语句是以不同方式处理的两种不同结构。 不幸的是,语法几乎完全相同,所以它不仅会让程序员感到困惑,即使解析器也难以分辨您的意思!

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

    上一篇: What do parentheses surrounding an object/function/class declaration mean?

    下一篇: Why do we need middleware for async flow in Redux?