一.let声明
1. let和var作用差不多,但有非常重要的区别。最明显的区别就是,let的声明的范围是块作用域,但是var声明的范围是函数作用域。
2.块作用域是函数作用域的子集,因此适用于var的作用域限制也同样适用于let。
3.let不允许同一个块级作用域中出现冗余声明(不能声明相同名称的变量)。而js引擎会记录用于声明变量声明的标识符不会报错,因此嵌套使用不会报错。
4.对冗余声明报错不会因混用let和var而受影响。这两个关键字声明的并不是不同类型的变量,只是指出变量的相关作用域如何存在。
var name;
let name;//SyntaxError
(1)暂时性死区
let和var另一个重要区别就是let声明的变量不会在作用域中被提升。那么在let声明之前不能以任何方式来引用未声明的变量。而在声明执行前的瞬间被称为“暂时行死区”。报ReferenceError。
(2)全局声明
和var关键字不同,使用let在全局声明的变量不会成为window对象的属性。
(3)条件声明
let不像var不能依赖条件声明模式。其实依赖条件声明反而会使程序更加难以理解。不依赖是件好事。
(4)for循环中的let声明
一个例子:for (var i = 0 ;i<5;++i ){
setTimeout(()=>console.log(i)),0}
你可能以为会输出0,1,2,3,4
实际上会输出5,5,5,5,5
而let就会输出0,1,2,3,4
二.const声明
const行为和let基本相同,唯一一个重要区别就是声明变量是初始化变量就是给它赋值,且修改const变量会导致运行错误。
const age = 20;//
age=36//TypeError 给常量赋值
当然他的限制只适用于它指向的变量的引用。就是const引用一个对象,那么修改对象内部属性并不违反const限制。
const person = {};
person.name="caicai";//正确的
三.使用
有了let和const,限制自己只使用let和const有助于提升代码质量,因为变量有了明确的作用域,声明位置,以及不变的值。
const优先,let次之。使用const声明可以让浏览器运行时强制保持变量不变,也可以让静态代码分析工具提前发现不合法的赋值操作。因此大量开发者认为因优先使用const,只有在提前知道未来会修改的变量时使用let。可以使开发者更有信心推断某些量的值永远不会变,同时也能迅速发现因意外导致的非预期行为。