为什么'error'变量重新分配在功能上不属于catch {}块的范围?

时间:2019-05-02 08:33:58

标签: javascript error-handling scope try-catch var

我正在使用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)
})();

2 个答案:

答案 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中处理作用域的一种特殊情况,在进行一些挖掘之前,肯定是一个“陷阱”。

希望这对其他人有帮助!

docsenter image description here