【问题标题】:Why is assigning a value to the variable "let" possible? [duplicate]为什么可以为变量“let”赋值? [复制]
【发布时间】:2018-01-13 05:55:51
【问题描述】:

我正在参加在线 JS 课程,讲师使用的语法是:let = names = ["Bob","Tim","Larry"]。我确信这是一个意外,但不知何故被他使用的 JS 环境所允许。他最终所做的(可能是偶然的)是将数组分配给“names”变量,然后将其分配给“let”变量。

我的问题:为什么这不是错误?为什么“让”可以用作变量?我们知道“让”是一个关键字。或者这只是他们还没有取缔的东西?您仍然可以在 Chrome 和 Firefox 控制台中执行此操作……同样也可以在 Node 中执行此操作。

【问题讨论】:

  • 有趣的地方。 let=123 是允许的,它将创建一个值为 123 的全局范围变量,但 var=123 会引发错误。
  • let=123工作的环境下,let foo = 123工作;也工作?你可以在同一个脚本中做这两个吗?
  • 出于某种原因,他们没有将其包含在保留关键字列表中。实际上,您甚至可以执行 var let = 'something' 并且它可以工作,但是为了避免第一个问题(意外分配一个全局变量而不是初始化一个名为 names 的数组,您可以将 'use strict' 添加到脚本的开头。
  • @JeffUK 我认为这在任何环境中都行不通,因为 pre-let 浏览器会抛出意外的标识符,而 ES6 兼容的浏览器会抛出意外的数字,因为没有= 它会尝试贴花变量.
  • 由于let 是最近才被引入到 JavaScript 中的,因此将 `let` 用作非法变量名将是一个危险的步骤。这可能会导致遗留代码出现问题。

标签: javascript syntax ecmascript-6 let


【解决方案1】:

在 ES3 及更早的 JavaScript 版本中,let 没有任何特殊含义,可以用作标识符。但是,const 已经在未来保留字列表中。见http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.pdf, 7.5.1 保留字

ES5 添加了“严格模式”。 const 仍在未来保留字列表中,let 在严格模式下将被视为未来保留字:http://www.ecma-international.org/ecma-262/5.1/index.html#sec-7.6.1

ES6 给constlet 赋予了含义,但let 仍然不是保留字。相反,它在http://www.ecma-international.org/ecma-262/6.0/#sec-keywords 中说:

strict mode code中,letstatic通过静态语义限制(参见12.1.113.3.1.113.7.5.114.5.1)而不是词汇语法被视为保留关键字。

换句话说,在严格模式之外,您可以使用let 作为变量名和声明其他变量。

let 没有被制成保留字的原因可能是为了不破坏可能使用let 作为正常标识符的现有代码。

【讨论】:

    【解决方案2】:

    由于向后兼容性问题,它不在您的浏览器正在实施的 EcmaScript 版本的保留关键字列表中。您可以通过在现代浏览器中使用 .js 文档中的 'use strict' 来选择退出此行为。至于将来保留哪些关键字但在当今的浏览器中最有可能仍未保留的关键字列表,请查看此列表:JavaScript List of Reserved Keywords。请注意,标有 * 的是 ES5 - ES6 特定的关键字,这意味着它们可能会在以后添加到实际列表中。

    请注意,const 是在较早阶段添加的,因此它是今天的保留关键字并且已正确实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-15
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2022-11-27
      • 1970-01-01
      • 2021-09-14
      • 1970-01-01
      相关资源
      最近更新 更多