考虑以下摘录from ECMA-262 v5.1(我最近在this question看到的):为什么catch子句有他们自己的词汇环境?
甲词法环境是用于定义标识符基于的ECMAScript的代码的词法嵌套结构中的特定的变量和函数的相关联的规范类型。词法环境由一个环境记录和一个可能为空的外部词法环境引用组成。通常,词法环境与某些ECMAScript代码的特定语法结构相关联,例如FunctionDeclaration,WithStatement或TryStatement的Catch子句,并且每次评估此类代码时都会创建一个新的词法环境。
我认为这意味着类似的功能做的catch
条款会对身体吊了自己的变量,但显然that's not the case:
var a = 1;
try {
console.log(x); // ReferenceError
} catch(ex) {
console.log(a); // 1, not undefined
var a = 3;
}
有谁知道为什么吗?另外,为什么catch
子句需要它自己的词汇环境?
“可能为null的外部词法环境引用”。意味着它也可以不为null,当它不为null时,它会发现全局变量就好了。 – 2013-02-22 23:25:21
@ Mike'Pomax'Kamermans我实际上期待'catch'可以拥有自己的局部变量,并且映射到全局变量。但它不能,因为为它创建的词法环境是另一种类型(参见Bergi的答案,以及[10.3]中的规范(http://www.ecma-international.org/ecma-262/5.1/#sec -10.3))。 – bfavaretto 2013-02-23 04:21:22