ES6详细理解
let && const
let
基本用法
ES6新增let声明变量,用法类似于var,但是let定义的变量只在命令所在的代码块内有效
{
let a = 10;
var b = 1;
}
a //报错 a is not definde
b // 1
上面的代码a已经在外部调用,而它定义的代码在内部,所以会报错。
建议在for循环中使用let定义i 防止变量污染
注意点
let不存在变量提升
var定义的变量,会进行变量提升,先进行变量声明,值为undefined
之后进行赋值
console.log(a) // 输出值为undefined
var a = 2;
console.log(b);//输出值为ReferenceError
let b = 3
暂时性死区
只要块级作用域内存在let命令,不受外部的影响
var tmp = 123;
if(true){
tmp = 'abc';
let tmp
}
在if内部重新定义了tmp导致又重新绑定了这个块级作用域,所以在let声明变量前,对tmp赋值会报错
if (true) {
// TDZ开始
tmp = 'abc'; // ReferenceError
console.log(tmp); // ReferenceError
let tmp; // TDZ结束
console.log(tmp); // undefined
tmp = 123;
console.log(tmp); // 123
}
上面代码中,在let命令声明变量tmp之前,都属于变量tmp的“死区”。
let 不允许在相同作用域内,重复声明同一个变量。
// 报错
function func() {
let a = 10;
var a = 1;
}
// 报错
function func() {
let a = 10;
let a = 1;
}
块级作用域与函数声明
ES5中函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明
ES6引入了块级作用域,明确允许在块级作用域之中声明函数,在ES6中,函数声明的行为类似于let,在块级作用域之外不可引用
const
const 声明一个只读的常量,一旦声明,常量的值就不能改变
const PI = 3.1415;
PI // 3.1415
PI = 3;
// TypeError: Assignment to constant variable.
改变定义的值会报错
const 声明的变量不得改变值,一旦声明变量,就必须立即初始化,不能先声明后赋值
const 实际上保证的不是值不变,而是变量指向的那个内存地址保存的数据不得改动
const a = [];
a.push('Hello'); // 可执行
a.length = 0; // 可执行
a = ['Dave']; // 报错
上面代码中,常量a是一个数组,这个数组本身是可写的,但是如果将另一个数组赋值给a,就会报错。
ES6中声明变量得六种方式
ES5 只有两种声明变量的方法:var命令和function命令。ES6 除了添加let和const命令,后面章节还会提到,另外两种声明变量的方法:import命令和class命令。所以,ES6 一共有 6 种声明变量的方法。
顶层对象的属性
顶层对象,在浏览器环境指的是window对象,在 Node 指的是global对象。
var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。也就是说,从 ES6 开始,全局变量将逐步与顶层对象的属性脱钩。