简述ES6新增关键字let与var的区别
最近看了很多文章,偶然间看到ES6中新增了一个关键字let,它具有与var关键字相似的功能。一开始使用它时,发现它让我对之前一些习以为常的东西产生了怀疑。
下面先让我们看看它和var之间用法的不同
{ vara=10; letb=8; } a//10 b//Referenceerror:bisnotdefined
上面在代码块中声明了两个变量并分别赋值输出到控制台,结果a的变量成功输出,b的输出结果产生了报错。可见,let声明的变量只在它所在的代码块中产生作用。同时,我们也能想到它最好的使用方法就是在for循环中使用。
下面我们再举个例子来观察它与var之间的区别:
vara=[] for(vari=0;i<6;i++){ a[i]=function(){ console.log(i); } } console.log("i的值:",i); a[4]();
它的输出结果为:
i的值:6
6
为什么是6呢?一开始我也被吓懵逼了,这有悖于我的常识,以往没注意到的地方,居然这么的low。在我的意识里结果应该4,而不是6。我想了很久也想不明白,以我这种小白的技术,自然是很难搞懂这种资深技术宅的问题。所以,我查了很多资料来解决这个问题,才搞明白。
在for里用var声明的i是全局变量,在循环外部也可以访问到,在循环体内每次循环都给i重新赋一次值,而i却是属于全局的,外部的i值最终是6,数组a[]指向的i始终都是同一个i,当循环结束时a[]函数内部的i就是最终i的结果 6。
如果使用let,声明的变量只在当前代码块中起作用
vara=[] for(leti=0;i<6;i++){ a[i]=function(){ console.log(i); } } console.log("i的值:",i); a[4]();
它的输出结果为:
i的值:6
5
上面代码中,变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,所以最后输出的是5。你可能会问,如果每一轮循环的变量i都是重新声明的,那它怎么知道上一轮循环的值,从而计算出本轮循环的值?这是因为JavaScript引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。
总结
以上所述是小编给大家介绍的ES6新增关键字let与var的区别,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!