2011-12-28 159 views
0

可能重复:
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](); 
    } 
} 
+0

不是一个确切的重复,但同样的想法。 – hvgotcodes 2011-12-28 21:13:52

+1

@ hvgotcodes好吧,有超过9000个确切的重复,所以它不是真的很重要,如果那不是:D – Esailija 2011-12-28 21:19:57

+0

精确地说,它的惊人多少次这个问题被问.... – hvgotcodes 2011-12-28 22:39:44

回答

1

裹有另一个函数内部函数会立即执行,并接收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通过任何的功能不断执行的时间)。)

1

当环路生成功能,它们以相同的范围内的所有共享访问的变量。在给定的范围内,只能有一个相同名称的变量。所以他们都使用循环中的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

0
function buildJobs(list) { 
    var jobs = []; 

    list.forEach(function(item){ 
     jobs.push(function(){ 
      alert(item); 
     }); 
    }); 

    return jobs; 
} 

forEach