异步引起的for循环问题

//  异步引起的for循环问题 1
for(var i=0;i<5;i++)
{
  setTimeout(function timer(){
  	console.log(i);
  },i*1000);
}
// 异步引起的for循环问题 2
for (var i = 1; i <= 5; i++) 
{
  item.onclick = function() {
    console.log(i);
  };
}

这两段代码中结果最终只输出5,真的和闭包没有一点关系。真正的原因是当给元素绑定事件或者设置定时器函数时就会形成异步;又因为js是单线程语言(一次只执行一件事情,在当前事件尚未执行完之前,即使异步函数调用事件到了,也要先把当前的事情执行完);这两段代码开始执行后首先读取到for循环(声明并初始化i的值,对i的值进行判断)然后进入for循环体内,遇到异步函数,把异步函数加入到任务池(所有异步函数都会被到这里,等待立即执行代码执行过后再开始执行),然后一根筋的js继续执行for循环,直到i=5;不再满足for循环的执行条件,便开始执行任务池中的异步事件(即给item元素绑定事件)

for(var i=0,arr=[];i<5;i++){
  arr.push(function(){alert(i)});
}
arr[0]()

js中的函数有很多的身份,上面的代码中for循环执行后,每次执行arr.push()函数把匿名函数当作值(此时函数仅仅是一段字符串而已)添加到arr数组中,如此反复执行最终到i=5;for循环停止;在通过arr0语句调用它之前,它仅仅是一段字符串,根本不会和i变量产生任何关系(事实上此时i也是函数字符串中的一部分);当我们调用函数,匿名函数首先在函数的作用域寻找变量i,没有找到,于是开始通过作用域链向上级作用域寻找,把全局总用域中的i=5赋给i ; 补充 实际上变量名仅仅是一个标识符,js通过它获取对变量值的引用;

//for循环的正常执行状况,可与上面两种情况进行比较理解
for(var i=0;i<5;i++){
    console.log(i)
} 
//每次for循环都会执行console.log(i)函数,实际上log()函数也形成闭包了

**

划重点

**
导致上面两种for循环取值问题的原因,和闭包没有任何关系,真正的原因是for循环改变了自己所在作用域里面的i变量,而函数里面没有i且对for循环作用域里面的变量i的使用是在这个改变之后的;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值