碰到一道题:

for(var i=0;i<2;i++){ 
setTimeout(function(){
console.log(i);
},100)
} //输出结果为:2 2
for(let i=0;i<2;i++){
setTimeout(function(){
console.log(i);
},100)
} //输出结果为:0 1

我们先从第一个for循环说起,setTImeout是异步执行的

因此setTImeout在异步队列中,需要等待同步队列(for循环)执行完成后才可进行,

此时,同步队列执行完成后i为2,所以执行setTImeout时,输出为2

接着看第二个for循环,由于i使用let定义的,let为块级作用域,但按我们的正常理解,应该会得出上边的结果

找了下网上,解释如下:

for循环中的let,事实上将其重新绑定到每一个循环迭代中,在确保上一次循环迭代结束后才会进行下一步循环,重新赋值

简单说就是let的for循环中,每次都需要保证循环体里的执行完毕后才会进行下一次循环(我是这么理解的)

又找了一个相似的例子

var a = [];
for (var i = ; i < ; i++) {
a[i] = function () {
console.log(i);
};
}
a[](); //

由于i是全局作用域,可被函数中的i获取得到,所以数组函数中输出的i均为10;

var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 6

而这里的i是块级作用域,当前i只能在本轮循环中奇效,每次循环中的i均为一个新的变量,因此最终取出的值为6

最新文章

  1. IT持续集成之质量管理
  2. [Unity] Shader - CG语言 和 HLSL语言
  3. javaweb 乱码---汉字存入mysql数据库中变成乱码
  4. MSTest、NUnit、xUnit.net 属性和断言对照表
  5. debug,trace,release项目配置区别
  6. python还不能作为主要编程语言的原因:
  7. 佛山Uber优步司机奖励政策(1月25日~1月31日)
  8. SHELL种类,版本及选择
  9. Poem: Reserverd Words
  10. mysql的触发器
  11. Java流的理解
  12. android Service Activity三种交互方式(付源码)(转)
  13. Java EE
  14. python之算法排序模块
  15. MySQL数据库、表常用操作
  16. JavaScript中易混淆的DOM属性及方法对比
  17. 洛谷P2740 草地排水
  18. 20145308 《网络对抗》 MAL_后门应用与实践 学习总结
  19. mysql分表实战
  20. Android JNI学习(四)——JNI的常用方法的中文API

热门文章

  1. 解决root无法登陆
  2. Cypress 之 URL访问
  3. Java中Atomic类的使用分析
  4. 练手爬虫用urllib模块获取
  5. ES6-Symbol的用法 ,symbol在对象中的应用,改变值
  6. ES6-数字操作,判断是否是整数,判断最大值最小值
  7. 2019 DevOps 必备面试题——DevOps 理念篇
  8. KumuluzEE - Java EE的微服务框架
  9. [20191119]探究ipcs命令输出.txt
  10. 【tf.keras】Resource exhausted: OOM when allocating tensor with shape [9216,4096] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc