let
>let 声明用于声明可重新赋值的块级作用域局部变量,并且可以选择将其初始化为一个值。
尝试一下
let x = 1;
if (x === 1) {
let x = 2;
console.log(x);
// Expected output: 2
}
console.log(x);
// Expected output: 1
语法
js
let name1;
let name1 = value1;
let name1 = value1, name2 = value2;
let name1, name2 = value2;
let name1 = value1, name2, /* …, */ nameN = valueN;
参数
描述
用 let 声明的变量的作用域是最靠近并包含 let 声明的以下花括号闭合语法结构的一个:
- 块语句
switch语句try...catch语句let位于其开头的for语句之一的主体- 函数主体
- 类静态初始化块
如果不是以上这些情况则是:
- 当代码以模块模式运行时,作用域是当前模块。
- 当代码以脚本模式运行时,作用域是全局作用域。
相较于 var,let 声明有以下不同点:
-
let声明的作用域是块或函数。 -
let声明在脚本的顶级作用域上声明变量时不会在全局对象上创建属性。 -
let声明的变量不能被同一个作用域中的任何其他声明重复声明。 -
let是声明,而不是语句的开头。这意味着,你不能将单独的let声明当做块的主体使用(因为这样做会让变量无法被访问)。jsif (true) let a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
注意:在非严格模式下允许将 let 作为 var 或者 function 的标识符名称,但你应当避免将 let 用作标识符以防止发生意外的语法混淆。
许多风格指南(包括 MDN 的)推荐只要变量没有在其作用域中被重新赋值,就应该使用 const 而不是 let。这样能更清楚地表明变量的类型(或值,如果其为原始值)永远不会改变。此外也推荐用 let 存放可变的非原始值。
let 关键字后方的列表叫做绑定列表,使用逗号分隔,其中的逗号不是逗号运算符,并且 = 符号也不是赋值运算符。后初始化的变量能够引用列表中之前初始化的变量。