我在闭包结束时读取()会立即执行它.那么,这两者之间有什么区别.我在一些代码中看到了第一次使用.
谢谢.
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]);
}
Run Code Online (Sandbox Code Playgroud)
Fel*_*ing 14
在这个例子中没有差异.在这两种情况下,anotherFn立即执行.
但是,在循环中创建函数时,通常会使用立即函数.
考虑这个例子(或多或少的伪代码):
for(var i from 1..10) {
elements[i].onclick = function() {
alert(values[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
由于JavaScript只有函数作用域,没有块作用域,所有事件处理程序共享相同的i,10在循环结束后它将具有值.所以每个处理程序都会尝试提醒values[10].
通过使用立即函数,引入了一个新的范围,它"捕获"循环变量的当前值:
for(var i from 1..10) {
(function(index) {
elements[i].onclick = function() {
alert(values[index]);
}
}(i));
}
Run Code Online (Sandbox Code Playgroud)
由于这有时难以阅读,因此创建一个返回另一个函数的独立函数通常会更好:
function getHandler(value) {
return function(){alert(value);};
}
for(var i from 1..10) {
elements[i].onclick = getHandler(values[i]);
}
Run Code Online (Sandbox Code Playgroud)