为什么我不能获得由吊装引起的JavaScript

时间:2016-04-16 00:06:30

标签: javascript hoisting

我正试图让我的头脑一直在提升,我正在通过一个代码学教程(es2015),我似乎无法让他们的代码工作。 (它们只显示部分代码,以下是我的版本)

function _myfunc(callback){
  callback();
}

function display(names){
  for(var i in names){
    _mfunc(function(){
      console.log(names[i]);
    });
  }
}
display(["Sam", "Tyler", "brook", "alex"]);

显然var i悬挂在for循环之上,我应该在控制台中看到的alex安慰了四次。但我看到所有四个名字都安慰了。 (然后我的意思是使用let而不是var来使其正常工作,但我需要在它开始工作之前制动它。

你能帮我修理/制动代码,这样我就可以看到吊装工作不符合预期的结果。

1 个答案:

答案 0 :(得分:1)

这将是打破代码的一种方法:

function display(names){
  for(var i in names){
    setTimeout(function() {
        console.log(names[i]);
    }, 0);
  }
}
display(["Sam", "Tyler", "brook", "alex"]);

这里发生的是传递给setTimeout的回调函数被安排在循环完成后运行。一旦它们都捕获了i变量,它在循环结束时具有值3 - 它们都输出相同的颜色。

PS:我建议不要使用for-in来迭代数组,而是使用普通for代替计数器。