- es6新增了
let
命令,用于声明变量,声明的变量只在let
命令所在的代码块内有效,在作用域外引用会报错
{
let a = 1
}
console.log(a)
VM511:4 Uncaught ReferenceError: a is not defined
at <anonymous>:4:13
-
var
命令会出现变量提升,变量可以在声明之前使用,值为undefined
,而let
声明的变量一定要在声明之后使用,否则会报错
console.log(a)
let a = 1
VM406:1 Uncaught ReferenceError: a is not defined
at <anonymous>:1:13
- 暂时性死区
只要块级作用域内存在let
命令,它所声明的变量就绑定这个区域,不再受外部变量的影响
var sisi = 123
if (true) {
sisi = 'abc'
let sisi
}
VM669:3 Uncaught ReferenceError: Cannot access 'sisi' before initialization
at <anonymous>:3:8
- 如果区块中存在
let
和const
命令,则这个区块对这些命令声明的变量从一开始就形成封闭作用域,只要在声明之前使用这些变量,就会报错。
console.log(typeof m)
let m = 1
VM977:1 Uncaught ReferenceError: m is not defined
at <anonymous>:1:9
暂时性死区的本质就是,只要进入当前作用域,所要使用的变量就已经存在,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用变量。
(function(){
var x = y = 1;
})();
console.log(y);
console.log(x);
VM1007:5 Uncaught ReferenceError: x is not defined
at <anonymous>:5:13
网友评论