思考:以下代码在全局作用域中的执行结果是什么?
for (var i = 0; i < 10; i++) {
setTimeout(function () {
console.log(i);
}, 0)
}
结果是:输出十个 10
分析:js的定时器是一个单独的线程,计时完成后将所要执行的任务添加到js引擎的任务队列中去。
而外层的for循环执行速度非常快,当js引擎从任务队列中取任务执行的时候,外层的for循环已经执行完毕,
且js没有块级作用域,因此js引擎执行console.log(i)的时候 i 已经变为10了,因此输出结果为十个10
问题:那么上面的代码如何改进,使输出 0 1 2 3 4 5 6 7 8 9 这种结果呢?
解决方案:利用闭包原理,创建匿名函数
for (var i = 0; i < 10; i++) {
(function (j) {
setTimeout(function () {
console.log(j);
},0);
})(i)
}
对于如何理解闭包,请参阅本系列前面的章节: 闭包原理