簡體   English   中英

使用“let”作為變量名不會在 google v8 中引發任何錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM