- 形成块级作用域
for (let i=0;i<3;i++) {
let i='abc';
console.log(i);
}
//abc
//abc
//abc
这里循环语句部分是一个父作用域,而循环体内部是一个单独的子作用域。
输出3次abc,表明函数内部变量i和循环语句中的i是分离的。
- 不存在变量提升
console.log(foo); //undefined
var foo=2;
//let 情况
console.log(bar); //ReferenceError
let bar=2;
- 暂时性死区(temporal dead zone)
如果区块中存在let和const命令,则这个区块不需等到代码执行到命令那一行就形成封闭作用域
var tmp=123;
if (true) {
tmp='abc'; //ReferenceError
let tmp;
}
在块内,使用let声明变量前,该变量都是不可用的。
function bar(x = y, y = 2) {
return [x, y];
}
bar(); // 报错
参数x默认值等于另一个参数y,而此时y还没有声明,属于”死区“。
- 不允许在相同作用域内重复声明同一个变量
// 报错
function () {
let a = 10;
var a = 1;
}
// 报错
function () {
let a = 10;
let a = 1;
}
//函数内部也不可以
function fn (arg) {
let arg; //报错
}
function fn (arg) {
{
let arg; //不报错
}
}
网友评论