【发布时间】:2011-12-17 02:16:57
【问题描述】:
ECMAScript 5 spec 声明如下:
通常,词法环境与某些特定的 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 帖子有点相关:stackoverflow.com/questions/6100230/…
标签: javascript