Javascript关闭

时间:2011-05-03 18:34:41

标签: 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]);
}

3 个答案:

答案 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的值将递增而不能正确传递给你的函数。

这是一个指南,向下滚动到在循环中创建闭包:一个常见的错误部分来查看问题:

https://developer.mozilla.org/en/JavaScript/Guide/Closures

答案 2 :(得分:1)

第一个定义self-invoking function(后者又执行一个函数),第二个只执行函数。在这两种情况下,传递给它的参数是a [i]。