let语法特性

  • 形成块级作用域
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; //不报错
  } 
}


你可能感兴趣的:(let语法特性)