[英]Javascript closure
我在闭包末尾读到的 () 会立即执行它。 那么,这两者有什么区别。 我在一些代码中看到了第一个用法。
谢谢。
for (var a=selectsomeobj(),i=0,len=a.length;i<len;++i){
(function(val){
anotherFn(val);
})(a[i]);
}
for (var a=selectsomeobj(),i=0,len=a.length;i<len;++i){
anotherFn(a[i]);
}
在这个例子中没有区别。 在这两种情况下, anotherFn
都会立即执行。
但是,当在循环中创建 function 时,经常使用立即数 function。
考虑这个例子(或多或少的伪代码):
for(var i from 1..10) {
elements[i].onclick = function() {
alert(values[i]);
}
}
As JavaScript has only function scope, no block scope, all the event handlers share the same i
, which will have the value 10
after the loop finished. 所以每个处理程序都会尝试提醒values[10]
。
通过使用立即数 function,引入了一个新的 scope,它“捕获”了循环变量的当前值:
for(var i from 1..10) {
(function(index) {
elements[i].onclick = function() {
alert(values[index]);
}
}(i));
}
由于有时很难阅读,因此创建一个独立的 function 并返回另一个 function 通常会更好:
function getHandler(value) {
return function(){alert(value);};
}
for(var i from 1..10) {
elements[i].onclick = getHandler(values[i]);
}
在您的示例中的两个实例中,这些值都执行相同的操作。 还有其他示例,如果您不小心使用第一种方法(使用自动执行匿名函数), i
的值将递增并且不会正确传递给您的 function。
这是一个指南,向下滚动到在循环中创建闭包:查看问题的常见错误部分:
第一个定义了一个自调用 function (它依次执行一个函数),第二个只执行 function。 在这两种情况下,传递给的参数都是 a[i]。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.