围绕对象/函数/类声明的括号是什么意思?
这个问题在这里已经有了答案:
这是一个自我执行的匿名功能。 第一组圆括号包含要执行的表达式,第二组括号执行这些表达式。
当试图从父命名空间隐藏变量时,这是一个有用的构造。 函数中的所有代码都包含在函数的私有范围内,这意味着它不能从函数外部访问,从而使其真正是私有的。
看到:
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?