【问题标题】:Why is a defined variable in try/catch block showing undefined in the same function scope? [duplicate]为什么 try/catch 块中的已定义变量在同一函数范围内显示未定义? [复制]
【发布时间】:2021-03-16 23:24:36
【问题描述】:

这段代码是我正在做的 javascript 课程的一部分。而这个练习是在我需要猜测输出的错误处理部分。

代码:

(function () {
  try {
    throw new Error();
  } catch (err) {
    var err = 5;   //creating another local err variable
    var boo = 10;
    console.log(err);
  }
  console.log(err);
  console.log(boo);
})();

输出:

5  
undefined   //I don't understand this part  
10  

错误在 catch 块中作为参数 err 传递。但是使用varerr 变量会被覆盖。因此,5 不会记录错误,而是记录在第一个 console.log(err) 中。

但我不明白为什么第二个console.log(err) 输出undefined。据我了解,var 不是块作用域,因此,在同一个函数作用域内,我应该可以访问 err 变量。而且,由于提升,var 最初变得未定义。但是由于try/catch 块是同步,并且我在定义变量后记录变量,不应该记录5吗?因为console.log(boo) 返回10 为预计。

是不是因为创建了与本地参数同名的变量?

注意:这是我关于 stackoverflow 的第一个问题。所以请原谅任何错误!

【问题讨论】:

标签: javascript error-handling try-catch undefined


【解决方案1】:

你说得对,var 是函数作用域而不是块作用域,但是如果 var 声明与 catch 块绑定变量具有相同的名称,从而导致阴影 var 声明不会提升到函数作用域。

规范的相关部分: https://262.ecma-international.org/10.0/#prod-annexB-CatchParameter

Catch 子句的块可能包含绑定名称的 var 声明,该名称也受 CatchParameter 约束。在运行时,此类绑定在 VariableDeclarationEnvironment 中实例化。它们不会影响 CatchParameter 引入的同名绑定,因此此类 var 声明的初始化程序将分配给相应的 catch 参数而不是 var 绑定。

【讨论】:

  • 这是正确答案,应该被接受。
  • 我仍然对异常绑定有点困惑,但是阅读 Lil Devil 给出的 link 确实澄清了我的概念。谢谢你。现在说得通了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
相关资源
最近更新 更多