一道题目引发的思考

最近在网上看到关于异步回调的一道面试题,下面直接上代码:

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
posted @ 2016-11-29 21:11  Choo-  阅读(136)  评论(0)    收藏  举报