JavaScript catch子句的作用域

16 浏览
0 Comments

JavaScript catch子句的作用域

根据ECMAScript 5规范,以下是说明:

通常,词法环境与ECMAScript代码的某些特定句法结构相关联,例如FunctionDeclaration、WithStatement或TryStatement的Catch子句,并且每次评估此类代码时都会创建一个新的词法环境。

如果我的理解是正确的,那么当在JavaScript中创建一个新的词法环境时,将进入一个新的作用域,这就是为什么在函数内部声明的变量在函数外部不可见的原因:

function example() {
    var x = 10;
    console.log(x); //10
}
console.log(x); //ReferenceError

因此,在上述函数声明中,会创建一个新的词法环境,这意味着x在可能存在的任何外部词法环境中都不可用。

上述引文中关于函数声明的部分似乎是有道理的。然而,它还声明为TryStatement的Catch子句创建了一个新的词法环境:

try {
    console.log(y); //ReferenceError,所以我们进入catch
} 
catch(e) {
    var x = 10;
    console.log(x); //10
}
console.log(x); //10 - 但为什么x在作用域内?

那么catch块的作用域是如何工作的?我是否对词法环境的理解有基本误解?

0