由于ES5只有全局作用域和函数作用域,因此ES6增加块级作用域。
let用于定义变量,块级作用域,for循环建议使用let;
let会引起变量提升,必须先声明,在调用;
let声明的变量,不允许重复声明;
let实际是创建了块级作用域,可以变成do表达式
例:let x = do {
let t = f();
t * t + 1;
};
上面代码中,变量x会得到整个块级作用域的返回值。
const变量定义常量,一旦定义,不可以修改;
const一旦声明变量,就必须立即初始化,不能留到以后赋值;
const的作用域与let命令相同:只在声明所在的块级作用域内有效;
const本质上保证的是保存的地址不可改动,内容是可以变化的;
例:const foo = {};
// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123
// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only
暂时性死区:
let和const都会存在,一旦声明,必须在声明之后使用,否则报错。
到现在ES6一共有六种声明变量的方法:
var、function、let、const四种
和以后新增的import和class共六种。
同时,之前顶层对象的属性赋值与全局变量的赋值,是同一件事:
var a = 3 与 window.a = 3 是一致的
这点一直是js一大败笔之一,ES6为了改变这一点,一方面规定,var和function依旧
是全局变量,顶层属性;另一方面规定,let命令、const命令、class命令声明的全局
变量,不属于顶层对象的属性。
let b = 1;
window.b //undefined