的ECMAScript 5 spec狀態如下:JavaScript的catch子句範圍
一般一個詞法環境與的ECMAScript的代碼中的一些特定 句法結構諸如FunctionDeclaration相關聯, 一個WithStatement或TryStatement的catch子句並且每次評估此類代碼時都會創建一個新的詞彙環境 。
如果我的理解是正確的,那麼當在JavaScript中創建一個新的詞法環境,一個新的範圍進入,這就是爲什麼在函數內部聲明的變量是不可見的是功能之外:
function example() {
var x = 10;
console.log(x); //10
}
console.log(x); //ReferenceError
所以在上面的函數聲明中,創建了一個新的詞法環境,這意味着x
在任何可能存在的外部詞法環境中都不可用。
所以上面有關函數聲明的引用部分似乎是有道理的。然而,它也指出,新的詞法環境是一個try語句的catch子句創建:
try {
console.log(y); //ReferenceError so we enter catch
}
catch(e) {
var x = 10;
console.log(x); //10
}
console.log(x); //10 - but why is x in scope?
那麼,如何一catch
塊工作的範圍?對於詞彙環境是什麼我有一個基本的誤解?
這個SO帖子是以某種方式相關的:http://stackoverflow.com/questions/6100230/javascript-catch-parameter-already-defined – Juri