我从How do JavaScript closures work?
中获取了一些代码我理解封闭是如何工作的:
function foo(x) {
var tmp = 3;
function bar(y) {
alert(x + y + (++tmp)); // will alert 16
}
bar(10);
}
foo(2);
这将始终警告16,因为bar可以访问被定义为foo的参数的x,并且它还可以从foo访问tmp。
我不明白它是如何运作的:
function createArray(array){
var outPut = [];
for (var i = 0; i<array.length; i++){
var inPut = array[i];
outPut.push( function() {alert(inPut + " " + array[i])} );
}
return outPut;
}
function tryArray(){
var finishedArray = createArray([1, 2, 3, 4]);
for (var i = 0; i < finishedArray.length; i++) {
finishedArray[i]();
}
}
tryArray();
它会记录4 undifined
四次。
我期望发生的是记录。 1 1 2 2 3 3 4 4
为什么没有发生这种情况?