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

Pra*_*avi 4 javascript google-chrome v8 node.js ecmascript-6

我在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
Run Code Online (Sandbox Code Playgroud)

这个缺陷存在于node.但是,当我在Babel REPL中尝试它时,它会抛出一个错误.

我认为这与Google v8有关

NoN*_*ded 6

出于兼容性原因,仅在严格模式下禁止使用保留的ES6关键字.

Babel(通过严格模式插件)默认使用严格模式.在浏览器或节点中,您可以通过添加"use strict";文件的开头或函数来隐式设置严格模式.

运行以下代码段会在Chrome中引发错误:

"use strict";
var let = 43;
// Throws: Uncaught SyntaxError: Unexpected strict mode reserved word
Run Code Online (Sandbox Code Playgroud)


Joe*_*lay 6

Mohsen Azimi本文中可以找到关于背后推理的一篇很好的文章.以下是它的快速摘要.

以下关键字在JavaScript规范中定义为FutureReservedWord:

implements     interface   let       package    private
protected      public      static    yield
Run Code Online (Sandbox Code Playgroud)

在正常模式下,这些可以用作变量名而没有错误; 但是,在严格模式下,它们被视为保留字,并将抛出以下错误:

SyntaxError: Cannot use the reserved word 'let' as a variable name in strict mode.
Run Code Online (Sandbox Code Playgroud)

这样ES215之前的代码就不会破坏 - 如果有人let在遗留应用程序中命名了很多变量,如果JS规范突然破坏了所有内容,他们可能会感到不高兴.