我正在使用JavaScript中的try-catch块,并且遇到了一些我不完全了解的变量作用域行为。
我知道console.log(boo)
将20
打印到控制台,因为该变量已经用var
关键字声明,因此在功能上是作用域的(即,不是作用于catch块的作用域)
但是,我不明白为什么err
变量也不能以与boo
变量相同的方式作用于IIFE。因此,我不明白为什么undefined
在catch块之外。
(function() {
try {
throw new Error();
} catch (err) {
var err = 10;
var boo = 20;
console.log(err); //'10' (as I expect)
}
// Why doesn’t this log '10' ???
console.log(err); // 'undefined' (but I expected '10')
console.log(boo); // '20' (as I expect)
})();
答案 0 :(得分:3)
尽管var
将符号提升到功能块的顶部,但是catch子句的“参数”对于该子句而言是局部的。由于您将提升的值命名为与子句符号相同的名称,因此可能会造成混淆。本质上,您的代码与:
(function () {
var err;
var boo;
try {
throw new Error();
} catch (err) {
err = 10; // Set the catch's "local" `err` identifier to `10`
boo = 20;
console.log(err);
}
console.log(err); // The hoisted `err` was never set.
console.log(boo); // ’20’ (as I expect)
})();
答案 1 :(得分:2)
我找到了答案。
这是因为在catch块执行完之后,异常“ identifier”(在上面的示例中为“ err”变量)不可用。这似乎是在JS中处理作用域的一种特殊情况,在进行一些挖掘之前,肯定是一个“陷阱”。
希望这对其他人有帮助!
从docs: