let 和 const 是 ES6 中新增的声明对象的类型。与 var 相比,let 和 const 不存在变量提升。变量提升,指的是在变量声明之前就可以使用,只是,在声明之前,变量的值为undefined。var 声明的变量,在全局范围内都有效,而 let 声明的变量,只在 let 所在的作用域内有效。如以下 for 循环:
for(var i = 0; i < 10; i++) {
console.log(i)
}
console.log(i); // 10
在上述代码中,一般情况下,我们期望的是,报错,i is not defined。但是,由于在 for 循环内,i 是用 var 声明的,导致 i 在全局范围内都有效,所以输出 10. 要想避免这种情况,则应该使用 let ,使得 i 只在循环体内有效。
let 还有一个特点,就是会将所声明的变量绑定与let所在的作用域,不受作用域外变量的影响。
var a = 1;
if (true) {
a = 2; // 报错,a is not defined
let a;
}
上述代码,在 if 语句内部对 a 赋值,会报错,即使已经在外部定义了 var a。所以,在一个作用域内,在 let 声明一个变量前,都不能操作该变量。这种现象在语法上称之为“暂时性死区”(temporal dead zone,简称TDZ)。
现在再来看看我上篇文章提到的那个题目:
function a() {
return foo;
var foo = 1;
}
function b() {
return foo;
let foo = 1;
}
console.log(a()); // undefined
console.log(b()); // 报错 : foo is not defined
第一个函数,在创建活动对象的时候,可以创建被 var 声明的 foo,只是此时返回的是 undefined。
第二个函数,在创建活动对象的时候,不能收集被 let 声明的 foo,因为在 let 存在的作用域内,在 let 声明前,不能操作被 let 声明的对象。
再来看一种情况:
function a() {
return foo;
let foo = 1; // 报错 : Identifier 'foo' has already been declared
function foo() { };
}
console.log(a());
上述代码,在创建活动变量的时候,会报错。创建活动变量的细节在上一篇文章中。报错的原因是,不允许使用 let 重复声明变量。而使用 var 就不会有这种限制。
function a() {
var foo = 1;
var foo = function () { };
return foo;
}
console.log(a()); // function......
---------------------
作者:人间大炮王
来源:CSDN
原文:https://blog.csdn.net/gebingsheng/article/details/81103341
版权声明:本文为博主原创文章,转载请附上博文链接!
网友评论