let、const
⭐ let & const 与 var 的区别?
- var 和 let 用以声明变量,const 用于声明只读的常量;
- var 声明的变量,不存在块级作用域,在全局范围内都有效,let 和 const 声明的,只在它所在的代码块内有效;
- let 和 const 不存在像 var 那样的 “变量提升” 现象,所以 var 定义变量可以先使用,后声明,而 let 和 const 只可先声明,后使用;
- let 声明的变量存在暂时性死区,即只要块级作用域中存在 let,那么它所声明的变量就绑定了这个区域,不再受外部的影响。
- let 不允许在相同作用域内,重复声明同一个变量;
- const 在声明时必须初始化赋值,一旦声明,其声明的值就不允许改变,更不允许重复声明;如 const 声明了一个复合类型的常量,其存储的是一个引用地址,不允许改变的是这个地址,而对象本身是可变的。
⭐ 为什么已经有 var 了, 还要再推出 let 和 const
因为 var 存在两个特性或者说问题:
- 变量提升
- 重复声明(同一作用域下)
- if、for代码块中声明外界却可以访问
而 let、const 解决了这些问题:
- 声明之前无法使用
- 同一作用域下无法重复声明
- 使用的是块级作用域,if、for 这样的代码块中不对外界有干扰
⭐ 全局作用域中,用 const 和 let 声明的变量不在 window 上,那到底在哪里?如何去获取?
在 ES5 中,顶层对象的属性和全局变量是等价的,var 命令和 function 命令声明的全局变量,自然也是顶层对象。
var a = 12;
function f() {};
console.log(window.a); // 12
console.log(window.f); // f() {}