ES6 let关键字
let的特性:
【ES6是指ES2015以及之后的更新版本,即ES2016、ES2017......】
1. 具有块级作用域
if (true) { var num = 10; console.log(num); // 10 } console.log(num); // 'num' is not defined
弥补了ES5中var关键字声明的变量缺少块级作用域而导致的某些问题.
if (true) { var num = 10; console.log(num); // 10 } console.log(num); // 10
2. 取消了变量声明提升的功能.
console.log(num); // undefined var num = 20;
使用var时,具有变量提升过程,其实际JS执行步骤为:
var num; console.log(num); // undefined num = 20;
而使用let关键字声明变量时:
console.log(num); // ReferenceError: Cannot access 'num' before initialization let num = 20;
3. 在一个作用域中,同时声明两个同名变量会报错.
let num; var num; SyntaxError: Identifier 'num' has already been declared
在ES5中var声明两个变量不会报错:
console.log(num); // undefined var num = 20; console.log(num); // 20 var num = 30; console.log(num); // 30
4. let 具有暂时性死区.
var num = 30; if (true) { console.log(num); // 30 var num = 40; console.log(num); // 40 }
以上代码是ES5中var关键字声明的变量,在第一次输出num时,因为不具备块级作用域,具有变量提升,所以实际过程为:
var num; var num; // 这是{}中的num,{}不具备块级作用域,所以变量提升到顶部 num = 30; if (true) { console.log(num); // 30 num = 40; console.log(num); // 40 }
在ES6中,let具有块级作用域:
var num = 30; if (true) { console.log(num); // ReferenceError: Cannot access 'num' before initialization let num = 40; console.log(num); }
个人理解:在块级作用域中,若出现let声明的变量和上一级作用域中声明变量名称相同,则此块级作用域产生暂时性死区:
在块级作用域中声明此变量的语句执行前,若出现对此变量的输出或其他操作,则报此变量未初始化错误.
【而不是】像我们想象的那样,先去上一级作用域寻找有没有此变量,若有则正常输出.

浙公网安备 33010602011771号