for(let i = 0; i < 10; i++)和for(var i = 0; i < 10; i++)的思考
来源:互联网 发布:js拼接字符串逗号隔开 编辑:程序博客网 时间:2024/05/22 03:49
let、 var、 setTimeout,一点思考。
for(var i = 0; i < 10; i++){ setTimeout(function(){ console.log(i); },100);}
结果是很显而易见的,10次都是10,在面试前端的闭包知识时候很常见。
用上let之后,
for(let i = 0; i < 10; i++){ setTimeout(function(){ console.log(i); },100);}
结果是:
0、1、2、3、4、5、6、7、8、9
为什么var和let声明的i,得到不同的结果?
var声明的i,作用域不仅仅在for循环内,还在for循环的外部。
当setTimeout执行的时候,for循环已经完成,i此时的值是10,我们稍微调整一下代码:
for(var i = 0; i < 10; i++){ setTimeout(function(){ consoleLog(); },100);}function consoleLog(){ console.log(i);}
结果是10次10。
for(var i = 0; i < 10; i++)
和
var i;for(i = 0; i < 10; i++)
等价。
但是在let声明的时候则不一样,
for(let i = 0; i < 10; i++)
和
let i;for(i = 0; i < 10; i++)
是不等价的,因为let声明只在代码块中有效。
但是,如果仅仅这样,我们或许很容易理解
for(var i = 0; i < 10; i++){ setTimeout(function(){ console.log(i); },100);}
得到10次10,然而为什么
for(let i = 0; i < 10; i++){ setTimeout(function(){ console.log(i); },100);}
得到0-9?
在setTimeout的时候,匿名函数function(){console.log(i);}会被声明创建,当匿名函数执行的时候,会查找当前运行环境的 i 的值。
var声明的 i ,运行环境的 i 的值为10,但是let声明的 i,运行环境中 i 的值是每一个循环创建匿名函数时候的 i。
所以得到了0-9的值。
let替换var,可以很好的解决闭包的问题。
阅读全文
0 0
- for(let i = 0; i < 10; i++)和for(var i = 0; i < 10; i++)的思考
- for(int i = 0;i < 10;i++)和int i;for(i = 0;i < 10;i++)
- for(var i in aArray) 和 for(i=0; i<aArray.length; i++)
- for(int i = 0; i < 10; i++) 与 for(int i = 0; i < 10; ++i) 的区别
- 关于for (var index in items)和for (var i = 0; i < items.length; i++)
- for(var i in hArr)与for(var i=0;i<hArr.length;i++)的区别
- for( i=0; i<5; a[i] = i++);
- for (int i=0;i<GetMenuItemCount(hMenu1);i++)
- swift 如何使用 for(i=0;i<n;i++)
- [JST]不支持for(var i=0;i<length;i++)问题解决方法
- foreach和for(i=0;i<collection.size();i++)的区别
- 大话 i++、++i和i=++i、i=i++
- for(i=0,j=0;i<10,j<6;i++,j++)问题
- 用c:forEach实现for(int i=0 ; i < 10 ; i++)
- for(int i=0;i<list.size();i++) 与 for(int i=0,len=list.size();i<len;i++)的区别
- i++ ,++i,i=i++的问题
- i++ ,++i,i=i++的问题
- fs = [(lambda n, i=i : i + n) for i in range(10)]
- 内存管理
- C++中的接口与实现
- 深度学习第四章-数值计算笔记
- SVN服务器搭建和使用(三)
- apk-checklist
- for(let i = 0; i < 10; i++)和for(var i = 0; i < 10; i++)的思考
- 小白学分布式程序开发13-幂等性
- tuxedo管理命令之tmadmin
- 如何在微信公众号上进行中医预约
- HDU 2896:病毒侵袭(AC自动机入门题)
- 笔试面试知识细节
- 编写一个讲输入复制到输出的程序,并将其中连续的多个空格用一个空格代替。
- VisualSVN错误 Cannot query proxy blanket解决办法
- AndroidStudio报错:Error:Conflict with dependency 'com.google.code.findbugs:jsr305'