![](/img/trans.png)
[英]Redeclaration with var works but not with let in Chrome Snippets
[英]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靜態語義:早期錯誤指出:
如果
BoundNames
的FormalParameters
任何元素也出現在FunctionBody
的LexicallyDeclaredNames
中,則是語法錯誤。
當使用let
或const
您要將一個項目添加到LexicallyDeclaredNames
的結果中,這意味着它們將與在函數params( FormalParameters
)中聲明的變量沖突。
使用var
不會出錯,因為LexicallyDeclaredNames
不包含var
語句。 在此錯誤中包含var
將會是向后兼容的重大更改,因此它不會出錯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.