一道题目引发的思考
最近在网上看到关于异步回调的一道面试题,下面直接上代码:
1 for(var i = 0; i < 10; i++){ 2 setTimeout(function(){ 3 console.log(i); 4 },1000); 5 }
我看到这题时,很快就写下了答案,不就是
0,1,2,3,4,5,6,7,8,9
然而在机器上跑了一下,答案是
10,10,10,10,10,10,10,10,10,10
我随后查阅了各种文档,最终得出答案!
因为 setTimeout 是异步执行的,在 setTimeout 执行之前,for循环早已循环结束,所以当 setTimeout 在执行时 i 的值已经变成了10,所以最终输出:
10,10,10,10,10,10,10,10,10,10
那么问题来了,什么是异步执行呢?
【例子】小明用迅雷下载一部x国电影:
同步:小明等待电影下载完后愉悦的看了起来。
异步:小明在下载的过程中,看到左下角有个边下边播按钮,咿呀,小明点了边下边播的按钮并兴奋的看了起来。
好了,原因说完了,原理也说完了,下面就说说解决方案吧!
解决方案:
在使用i的时候保证i的值还是我们当时希望的那个值。 我们用一个匿名函数,把i当做参数传进去,这样我们再用的i就是局部变量了。不会受到外边的影响了。
for(var i = 0; i < 10; i++){ (function(i){ setTimeout(function(){ console.log(i); },1000) })(i); } //0,1,2,3,4,5,6,7,8,9

浙公网安备 33010602011771号