最近一段时间一直在写js,给了我很多认真学习js的时间。今天上午正好遇到一个循环语句中写闭包造成的一个问题。看下下面代码,原意是想每隔段时间打印出一个字母出来。

var myArray = ['h', 'e', 'q', 'c'];
for(var i in myArray) {
    setTimeout(function(){
        console.log(myArray[i]);
    }, 100 * (i + 1));
}

但是,实际的结果,它打出了4个c。其实仔细想想其实也不难理解,setTimeout里的函数并不是立即执行,它是过了一段时候后再执行的,这时i的值已经是i = 3了,所以它每次都只输出的是c。这是我个人比较简单的理解。网上有很多关于这种问题的讨论,可以看看知乎上的这篇文章,解释的比较详细。

那如何解决这个问题?简单的做法就是套个函数给它。代码如下:

var myArray = ['h', 'e', 'q', 'c'];
for(var i in myArray) {
    printOut(i);
}
function printOut(index) {
    setTimeout(function(){
        console.log(myArray[index]);
    }, 100 * (index +1));
}


blog comments powered by Disqus