Javascript关闭

bsr*_*bsr 3 javascript

我在闭包结束时读取()会立即执行它.那么,这两者之间有什么区别.我在一些代码中看到了第一次使用.

谢谢.

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)