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

我正在写一些随机代码在Chrome开发者控制台。 令我惊讶的是,铬让我使用let作为一个完全错误的variables名,因为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 。 但是,当我在Babel REPL中尝试它时,会抛出一个错误。

我认为这与Google v8有关

Mohsen Azimi在这篇文章中可以find一个很好的背后的推理。 这里有一个简要的总结。

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

 implements interface let package private protected public static yield 

在正常模式下,这些可以作为variables名而不会出错; 然而,在严格的模式下,他们被视为保留字,并会抛出以下错误:

 SyntaxError: Cannot use the reserved word 'let' as a variable name in strict mode. 

这是为了ES2015之前的代码不会中断 – 如果有人在遗留应用程序中命名了很多variables,那么如果JS规范突然打破了一切,他们可能不会高兴。

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

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

运行下面的代码片段会导致您在Chrome中发生错误:

 "use strict"; var let = 43; // Throws: Uncaught SyntaxError: Unexpected strict mode reserved word