开发者社区> 问答> 正文

for 循环中的setTimeout(function(){})异步问题,为什么改var 为let就可以解决?

1 for (var i=1; i<=9; i++) {
2     setTimeout( function timer(){
3     console.log( i );
4     },1000 );
5 }

上面的代码,由于setTimeout是异步的,那么在真正的1000ms结束前,其实10次循环都已经结束了
为什么改成let这样就可以解决?

1 for (let i=1; i<=9; i++) {
2     setTimeout( function timer(){
3         console.log( i );
4     }, 1000 );
5 }

还有另外一种方法,改成

1 for (var i=1; i<=9; i++) {
2     (function(j){
3         setTimeout( function timer(){
4             console.log( j );
5         }, 1000 );
6     })( i );
7 }

我觉得这种方法也是在timer()之外传入了参数i,跟一开始那个错误的代码并没有什么区别啊,为什么多加一层匿名函数就可以解决异步问题?

展开
收起
杨冬芳 2016-06-20 17:12:22 3255 0
1 条回答
写回答
取消 提交回答
  • IT从业

    这两种方法都不是解决异步问题的,而是解决变量作用域的问题的。

    因为函数 timer() 属于一个新的域,通过 var 定义的变量是无法传入到这个函数执行域中的,于是有了你展示的两种解决办法,第一种是通过使用 let 来声明块变量,这时候变量就能作用于这个块,所以 timer 就能使用 i 这个变量了。第二种是通过传入参数,间接的把变量传入到 timer 中。

    2019-07-17 19:44:23
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载