ES6 let var 暂时性死区

变量提升
var 在变量定义前可以调用

console.log(age)    //undefined
var age = 2

let在变量定义前不可调用

console.log(name)       //ReferenceError
let name = 'tom'

暂时性死区(temporal dead zone,简称 TDZ)
下面代码中,存在全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错

var tmp = 123
if (true) {
    tmp = '456'
    let tmp  // ReferenceError
}

不允许重复声明

// 报错
function () {
    let a = 10;
    var a = 1;
}
// 报错
function () {
    let a = 10;
    let a = 1;
}
//报错
function func(age){
    let age;
}
// 不报错
function func(arg) {
    {
        let arg; 
    }
}

Bug & Tip
ES6明确规定,如果区块中存在let和const命令,
这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。
凡是在声明之前就使用这些变量,就会报错。

function bar(x = y, y = 2) {
  return [x, y];
}
bar(); // 报错

function bar(x = 2, y = x) {
  return [x, y];
}
bar(); // [2, 2]

// 不报错
var x = x;

// 报错
let x = x;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值