为什么相同的JavaScript代码提供不同的输出?

时间:2018-03-28 04:55:26

标签: javascript

这是一段代码:



// -------- Sample 1 --------------- 
var funcs = [];
for (var i = 0; i < 3; i++) {  
    funcs[i] = function() {  
        console.log("My value: " + i); 
    };
}
for (var j = 0; j < 3; j++) {
  funcs[j](); 
}

// --------- Sample 2 --------------
var fun = [];
for(var i = 0;i < 3; i++) {
    fun[i] = function() {
        console.log('values is '+ i);
    }
}
for(var i = 0; i < 3; i++) {
    fun[i]();
}
&#13;
&#13;
&#13;

除变量名外,两个示例代码都相同。但它提供了不同的输出。上面代码的输出是:

My value: 3
My value: 3
My value: 3
values is 0
values is 1
values is 2

任何人都可以弄清楚为什么会发生这种情况吗? DEMO

1 个答案:

答案 0 :(得分:2)

var被提升,所以对于翻译来说,第一部分i实际上看起来更像是这样:

var funcs = [];
var i;
for (i = 0; i < 3; i++) {      
  funcs[i] = function() {          
    console.log("My value: " + i); 
  };
}
// At this point, the for loop has finished; `i` has the value of 3 now:
for (var j = 0; j < 3; j++) {
  // Each function retrieves the value of i and displays it
  // and since `i` is 3, each function displays 3:
  funcs[j]();                     
}

在你的第二个样本中(由于i被声明了两次,这有点无效),i被重新分配给值0,1和2 ,同时循环显示{ {1}}。