繁体   English   中英

Javascript 闭合

[英]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。

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

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

第一个定义了一个自调用 function (它依次执行一个函数),第二个只执行 function。 在这两种情况下,传递给的参数都是 a[i]。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM