let与const
let
- 暂时性死区
ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。语法上成为暂时性死区。
- typeof运算符是百分之百安全的设定不再成立。
typeof a; // ReferenceError
let a;
- 不允许重复声明变量。
- 出现块级作用域的概念。
块: { }
ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。ES6 规定,块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用。
- ES6 的块级作用域必须有大括号,如果没有大括号,JavaScript 引擎就认为不存在块级作用域。let只能出现在当前作用域的顶层,函数也是如此。
let flag = false;
if(flag) let b = 2;
if (flag) {
let b = 2;
}
const
- const声明一个只读的常量。一旦声明,常量的值就不能改变。
- 块级作用域内有效。
- 存在暂时性死区,作用域不可提升。
- const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。(特别注意)
ES6中声明变量的六种方式
var[es5],function[es5],let,const,import,class
顶层对象
- 浏览器环境指的是window,node环境指的是global。
- ES6 开始,全局变量将逐步与顶层对象的属性脱钩。
- ES2020 在语言标准的层面,引入globalThis作为顶层对象。也就是说,任何环境下,globalThis都是存在的,都可以从它拿到顶层对象,指向全局环境下的this。