使用'让'作为变量名称不会在谷歌v8中引发任何错误

时间:2016-11-14 09:16:26

标签: javascript node.js google-chrome ecmascript-6 v8

我在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中。但是,当我在enter image description here中尝试时,它会抛出一个错误。

我认为这与Google v8有关

3 个答案:

答案 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 只是生成器函数中的保留字。