一、区别
ES6新版中增加的let有这么几大特性:
1.不允许变量提升;
2.同一作用域内不允许重复声明;
3.暂时性的死区;
4.块级作用域;
与let相比老版本中的var声明的变量就显得比较宽松了:
1.省略不写的时候表示全局变量;
2.声明的变量会提升到作用域开始的位置;
3.可以重复声明;
4.只有全局和局部作用域,除非在闭包环境下,否则不会产生类似块级作用域的效果
二、场景举例
一般在使用let的时候,除了使我们的语法更严格之外,还利用了块级作用域的特性,在不产生闭包环境的情况下,让要声明的变量成为私有变量,如for循环中的点击事件要访问for循环的计数器i,此时使用let声明计数器,会在for循环中产生一个块级作用域,所有在这个块级作用域中的代码段都可以访问到每次i的值
而如果用var声明这个计数器的话,就需要一个闭包环境来实现这个操作,那么闭包环境又需要消耗大量的内存。所以在此种情况下更适合使用let
那什么时候适合使用var而不适合用let呢,目前来看,好像还没有这种情景,几乎所有能用var实现的需求,使用let都能实现,并且代码更规范,语法更严格。而且随着前端行业的发展,ES6的全面推广也是早晚的事,let全面替换掉var也是有可能发生的事
但是就目前的情况来看,ES6还未全面流行开来,浏览器的兼容也没有完全解决,相应的如let之类ES6中新增的关键字也存在一定的兼容隐患,正如一句话所说:
新特性一时爽,兼容性火葬场。
三、总结
let和var的抉择需要视情况而定,并不是所有情况下let都优于var。(如果有兼容问题,let反而会失效或报错)
那么在项目中如何去选择呢,我认为遵循两个原则就好:
1.用自己熟悉的
2.根据公司或项目要求决定