考虑以下来自 ECMA-262 v5.1的摘录(我最近在这个问题中看到):
词法环境是一种规范类型,用于根据 ECMAScript 代码的词法嵌套结构定义标识符与特定变量和函数的关联。一个词法环境由一个环境记录和一个对外部词法环境的可能为空的引用组成。通常,词法环境与 ECMAScript 代码的某些特定句法结构相关联,例如 FunctionDeclaration、WithStatement 或 TryStatement 的 Catch 子句,并且每次评估此类代码时都会创建一个新的词法环境。
我认为这意味着catch
子句的主体会像函数一样提升自己的变量,但显然情况并非如此:
var a = 1;
try {
console.log(x); // ReferenceError
} catch(ex) {
console.log(a); // 1, not undefined
var a = 3;
}
有人知道为什么吗?另外,为什么一个catch
子句需要它自己的词法环境?