簡體   English   中英

使用let和var在函數體內重新聲明

[英]Redeclaration in function body with let and var

function func(arg = 1) {
    var arg = 2; // success
    // let arg = 2; // SyntaxError: Identifier 'arg' has already been declared
}

我遵循了ECMA spec-7.0 FunctionDeclarationInstantiation算法,以了解為什么可以確切地使用var在函數體中重新聲明變量。

在步驟21中,所有參數均已初始化。 但是該算法都使用CreateMutableBinding來初始化主體中為var (27.fi2)和let (34.b.ii.1)聲明的變量,那么為什么var成功而let失敗? 我在算法中錯過了哪些步驟?

這就是所謂的“早期錯誤”,本質上是一種規范聲明應該拋出錯誤的斷言。 在這種情況下, 14.1.2靜態語義:早期錯誤指出:

如果BoundNamesFormalParameters任何元素也出現在FunctionBodyLexicallyDeclaredNames中,則是語法錯誤。

當使用letconst您要將一個項目添加到LexicallyDeclaredNames的結果中,這意味着它們將與在函數params( FormalParameters )中聲明的變量沖突。

使用var不會出錯,因為LexicallyDeclaredNames不包含var語句。 在此錯誤中包含var將會是向后兼容的重大更改,因此它不會出錯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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