此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。

View in English Always switch to English

let

基线
广泛可用

自 2016年9月 起,此特性已在主流浏览器中得到支持,可在大多数设备和浏览器版本中正常使用。

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;

参数

nameN

要声明的变量的名称。必须是合法的 JavaScript 标识符解构绑定模式

valueN 可选

变量的初始值。可以是任意合法的表达式。默认值为 undefined

描述

let 声明的变量的作用域是最靠近并包含 let 声明的以下花括号闭合语法结构的一个:

如果不是以上这些情况则是:

  • 当代码以模块模式运行时,作用域是当前模块。
  • 当代码以脚本模式运行时,作用域是全局作用域。

相较于 varlet 声明有以下不同点:

  • let 声明的作用域是块或函数。

  • let 声明的变量只能在执行到声明所在的位置之后才能被访问(参见暂时性死区)。因此,let 声明通常被视为是非提升的

  • let 声明在脚本的顶级作用域上声明变量时不会在全局对象上创建属性。

  • let 声明的变量不能被同一个作用域中的任何其他声明重复声明

  • let 声明,而不是语句的开头。这意味着,你不能将单独的 let 声明当做块的主体使用(因为这样做会让变量无法被访问)。

    js
    if (true) let a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
    

注意:在非严格模式下允许将 let 作为 var 或者 function 的标识符名称,但你应当避免将 let 用作标识符以防止发生意外的语法混淆。

许多风格指南(包括 MDN 的)推荐只要变量没有在其作用域中被重新赋值,就应该使用 const 而不是 let。这样能更清楚地表明变量的类型(或值,如果其为原始值)永远不会改变。此外也推荐用 let 存放可变的非原始值。

let 关键字后方的列表叫做绑定列表,使用逗号分隔,其中的逗号不是逗号运算符,并且 = 符号也不是赋值运算符。后初始化的变量能够引用列表中之前初始化的变量。