我在闭包结束时读取()会立即执行它。那么,这两者之间有什么区别。我在一些代码中看到了第一次使用。
感谢。
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]);
}
答案 0 :(得分:14)
在这个例子中没有差异。在这两种情况下,anotherFn
都会立即执行。
但是,当在循环中创建函数时,通常会使用立即函数。
考虑这个例子(或多或少的伪代码):
for(var i from 1..10) {
elements[i].onclick = function() {
alert(values[i]);
}
}
由于JavaScript只有函数作用域,没有块作用域,所有事件处理程序共享相同的i
,在循环结束后将具有值10
。因此,每个处理程序都会尝试提醒values[10]
。
通过使用立即函数,引入了一个新的范围,它“捕获”循环变量的当前值:
for(var i from 1..10) {
(function(index) {
elements[i].onclick = function() {
alert(values[index]);
}
}(i));
}
由于这有时难以阅读,因此创建一个返回另一个函数的独立函数通常会更好:
function getHandler(value) {
return function(){alert(value);};
}
for(var i from 1..10) {
elements[i].onclick = getHandler(values[i]);
}
答案 1 :(得分:3)
在示例的两个实例中,值都执行相同的操作。还有其他一些例子,如果你不小心使用第一种方法(使用自动执行的匿名函数),i
的值将递增而不能正确传递给你的函数。
这是一个指南,向下滚动到在循环中创建闭包:一个常见的错误部分来查看问题:
答案 2 :(得分:1)
第一个定义self-invoking function(后者又执行一个函数),第二个只执行函数。在这两种情况下,传递给它的参数是a [i]。