为了账号安全,请及时绑定邮箱和手机立即绑定

js循环中的闭包

js循环中的闭包

繁花如伊 2018-10-10 10:15:50
for(var i=0; i< 3;i++){  setTimeout(function() {    console.log(i);  }, 0);}输出结果是3,3,3  能否详细解释一下执行过程?
查看完整描述

1 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

JS var不是块作用域,所以,只有一个变量叫做isetTimeout的回调函数是在for执行完之后执行的,即i的值不会再改变。于是,一个变量,不可能同时等于多个不同的值。或者说下面的代码和上面的是一样的:

var i;

for(i=0; i< 3;i++){

  setTimeout(function() {

    console.log(i);

  }, 0);

}

JS 是单线程,意思是,一段代码在执行的时候不可能会被打断,不会突然跳转到其他地方的代码去运行。只有一段代码执行完毕,其他地方的代码才有可能执行。所以说for循环不会无缘无故的被打断,去其他地方执行代码。

console.log(i)只是函数声明的一部分,不属于for要执行的语句setTimeout(function(){console.log(i)},0),这句的意思是,定义一个函数其代码是“ console.log(i)”,设置一个定时器,0ms后执行这个函数。所以说在for循环里并不会执行console.log(i)这一句,因为它只是函数定义语句的一部分。


查看完整回答
反对 回复 2018-11-18
  • 1 回答
  • 0 关注
  • 532 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信