一、let声明的变量,仅在代码块内有效
下述代码中i为var声明,为全局作用域
var a = [];
for (var i = 0; i<10; i++){
a[i]=function(){
console.log(i)
}
}
a[5](); //10
下列代码中let仅在块状作用域内有效
var a = [];
for (let i = 0; i < 10; i ++){
a[i] = function(){
console.log(i)
}
}
a[5](); //5
for循环还有一个特别之处,就是设置循环变量的那个部分是一个父级作用域,而循环体内部是一个单独的自作用域。
for (let i = 0; i < 3; i++){
let i = 'abc';
console.log(i);
}
// 输出如下:
// abc
// abc
// abc
二、let声明的变量,不存在变量提升
console.log(test); //undefined
var test = 1;
console.log(test1) // Uncaught ReferenceError: test1 is not defined
let test1 = 1;
三、暂时性死区
只要块级作用域内存在let命令,他所生命的变量就“绑定”这个区域,不在受外部影响,不会再去寻找上一级作用域是否定义了该变量。以下代码中,let命令声明test3之前,都属于变量test3 的死区。
if (true){
//TDZ开始
test3 = 'abc'; // Uncaught ReferenceError: test3 is not defined
console.log(test3);//Uncaught ReferenceError: test3 is not defined
let test3; //TDZ结束
console.log(test3); //undefined
test3 = 123;
console.log(123); //123
}
四、不允许重复声明
let不允许在相同作用域内声明同一个变量
//报错
function abc() {
let a = 10;
var a = 1;
}
//报错
function abc() {
let a = 10;
let a = 1;
}
//报错
function abc(arg) {
let arg;
let a = 1;
}
//不报错
function abc(arg) {
{
let arg;
}
let a = 1;
}
五、let、const、class声明的全局变量不再属于顶层对象(window、global)属性
let b = 1;
window.b //undefined;
本文内容出自:《ES6标准入门》(阮一峰著)
网友评论