关闭的JavaScript在for循环中
问题描述:
可能重复:
Javascript closure inside loops - simple practical example
Javascript: closure of loop?关闭的JavaScript在for循环中
所以我想结果是1,2,3而不是3,3,3 。如何设置上下文/作用域以使作业使用正确范围的“我”?
function buildJobs(list) {
var jobs = [];
for (var i = 0; i < list.length; i++) {
var item = list[i];
jobs.push(function() {alert(item)});
}
return jobs;
}
function testJobs() {
var jobs = buildJobs([1,2,3]);
for (var j = 0; j < jobs.length; j++) {
jobs[j]();
}
}
答
裹有另一个函数内部函数会立即执行,并接收i
作为参数:
function buildJobs(list) {
var jobs = [];
for (var i = 0; i < list.length; i++) {
var item = list[i];
(function(i) {
jobs.push(function() {alert(list[i])});
})(i);
}
return jobs;
}
现在您要关闭在i
是本地包装功能,这是每次迭代中的一个不同的变量。 (在原始配置每个内部函数闭在相同变量(其值是3
通过任何的功能不断执行的时间)。)
答
当环路生成功能,它们以相同的范围内的所有共享访问的变量。在给定的范围内,只能有一个相同名称的变量。所以他们都使用循环中的i
,并在执行时使用当前值i
。而循环运行后,它将永远是3.
function buildJobs(list) {
var jobs = [];
for (var i = 0; i < list.length; i++) {
(function(i) {
var item = list[i];
jobs.push(function() {alert(item)});
})(i);
}
return jobs;
}
所以引入一个新的范围,捕捉的i
当前值只是该次迭代。现在您为每个生成的函数都有一个新的范围,每个函数的值都是i
。
答
function buildJobs(list) {
var jobs = [];
list.forEach(function(item){
jobs.push(function(){
alert(item);
});
});
return jobs;
}
不是一个确切的重复,但同样的想法。 – hvgotcodes 2011-12-28 21:13:52
@ hvgotcodes好吧,有超过9000个确切的重复,所以它不是真的很重要,如果那不是:D – Esailija 2011-12-28 21:19:57
精确地说,它的惊人多少次这个问题被问.... – hvgotcodes 2011-12-28 22:39:44