[英]Using 'let' as a variable name is not throwing any errors in google 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
。 但是,當我在Babel REPL 中嘗試時,它拋出了一個錯誤。
我認為這與 Google v8 有關
可以在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.
這是為了讓預ES2015代碼不破-如果有人叫他們很多變數let
在傳統的應用程序,他們可能不會是如果JS規范突然闖進一切快樂。
出於兼容性原因,僅在嚴格模式下禁止使用保留的 ES6 關鍵字。
Babel(通過嚴格模式插件)默認使用嚴格模式。 在瀏覽器或 Node 中你可以通過添加"use strict";
隱式設置嚴格模式"use strict";
在文件或函數的開頭。
運行以下代碼片段將在 Chrome 中按預期拋出錯誤:
"use strict"; var let = 43; // Throws: Uncaught SyntaxError: Unexpected strict mode reserved word
這是一種不斷發展的語言的樂趣。
簡而言之, const
在 ECMAScript 第一版中被列為“未來保留字”,這意味着雖然它沒有任何意義(當時),但它不能用於標識符。 (當然, function
一直是一個保留字。)但是let
既不是保留字也不是未來保留字,因此它可以用於標識符(並且曾經是)。 直到第 5 版才將let
確定為未來的保留字,然后才在新的嚴格模式 ES5 中添加。 (您的示例在嚴格模式下不起作用。)由於let
未被保留,因此它可能被廣泛用於代碼中,並且不能在 ES2015 中追溯成為純保留字。 因此,它仍然是一個有效的標識符(在松散模式下)。 解析器必須根據上下文確定它是聲明還是標識符。 (這樣做的后果樂趣,在松散模式,忘記之后鍵入一個標識符let
是不是一個語法錯誤, let = 42;
工作得很好-即使let
沒有宣布任何地方[感謝我所說的恐怖隱式全局變量]。這些是始終使用嚴格模式的充分理由[因為在嚴格模式下let
不能作為標識符,而嚴格模式沒有隱式全局變量]。)
JavaScript 也有上下文保留字。 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
函數中; 那么它是一個保留字。 這是可能的,因為在await
之前不存在async
函數,因此不可能存在使用await
作為標識符的async
函數。 同樣, yield
只是生成器函數中的保留字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.