我在chrome开发者控制台中编写了一些随机代码。令我惊讶的是,chrome允许我使用let
作为变量名,这是完全错误的,因为let
是保留关键字。我需要了解为什么会这样。
方案:
var const = 78 //throws an error as expected
var function = 46 //throws an error as expected
var let = 56 //didn't throw an error :O
let //prints 56, which is wrong because 'let' is a keyword
let ab = 90
ab //prints 90 as expected
这个缺陷存在于node
中。但是,当我在中尝试时,它会抛出一个错误。
我认为这与Google v8有关
答案 0 :(得分:6)
出于兼容性原因,仅在严格模式下禁止使用保留的ES6关键字。
Babel(通过strict mode plugin)默认使用严格模式。在浏览器或Node中,您可以通过在文件开头或函数中添加"use strict";
来隐式设置严格模式。
运行以下代码段会在Chrome中引发错误:
"use strict";
var let = 43;
// Throws: Uncaught SyntaxError: Unexpected strict mode reserved word

答案 1 :(得分:6)
可以在this article by Mohsen Azimi中找到有关此背后推理的精彩说明。以下是它的快速摘要。
以下关键字在JavaScript规范中定义为FutureReservedWord
:
implements interface let package private
protected public static yield
在正常模式下,这些可以用作变量名而不会出错;但是,在严格模式下,它们被视为保留字,并将引发以下错误:
SyntaxError: Cannot use the reserved word 'let' as a variable name in strict mode.
这样ES115之前的代码不会破坏 - 如果有人在遗留应用程序中命名了许多变量let
,那么如果JS规范突然破坏了所有内容,他们可能会感到不高兴。 / p>
答案 2 :(得分:0)
这是一种不断发展的语言的乐趣。
简短的版本是 const
在 ECMAScript 第一版中被列为“未来保留字”,这意味着虽然它没有任何意义(当时),但它不能用于标识符. (当然,function
一直是保留字。)但是 let
既不是保留字也不是未来保留字,因此它可以用于标识符(并且曾经是)。直到第 5 版才将 let
确定为未来保留字,然后才在新的严格模式 ES5 中添加。 (您的示例在严格模式下不起作用。)由于 let
未保留,因此它可能在广泛使用的代码中使用,并且不能在 ES2015 中追溯成为纯粹的保留字。因此,它仍然是一个有效的标识符(在松散模式下)。解析器必须根据上下文确定它是声明还是标识符。 (这有一个有趣的结果,即在松散模式下,忘记在 let
后输入标识符不是语法错误,let = 42;
工作得很好 - 即使 let
没有在任何地方声明[感谢我所说的 The Horror of Implicit Globals]。这些是始终使用严格模式的充分理由[因为 let
不能作为严格模式下的标识符,而严格模式没有隐式全局变量]。 )
JavaScript 也有 contextual 保留字。 async
是有效的标识符(即使在严格模式下,甚至在 async
函数中!) :
// Since `blah function` here is a syntax error:
blah function foo() {
}
// ...no valid code would have an identifier in that position, so it was possible
// to add an `async` modifier:
async function foo() {
}
await
是一个有效的标识符(即使在严格模式下),除非它在 async
函数中;那么它是一个保留字。这是可能的,因为 async
函数在 await
之前不存在,所以不可能存在使用 async
作为标识符的 await
函数。同样,yield
只是生成器函数中的保留字。