渔获量声明中没有起吊?

时间:2019-03-28 16:20:14

标签: javascript hoisting

我有此代码:

(function() {
   var ex;
   try {
       throw new Error('blah');
   } catch(ex) {
       console.log('ex i here:', ex);
   }
   console.log('ex out here:', ex);

   return 'hi';
})()

此日志:

  

在这里我:错误('blah');

     

在此处显示:未定义

为什么会这样?我认为由于吊起,ex的设置将超出此块范围,因此应该在ex out here中可用。

我希望它的工作方式类似于for循环:

for (i=0; i<2; i++) {
}
console.log(i); // gives 2

3 个答案:

答案 0 :(得分:3)

您搞砸了几件事。

定义为var的变量具有功能范围。 catch中的参数未吊起,它具有块作用域(仅在该捕获部分)。

如在本示例中所看到的:ab被吊起,然后可以在锁扣部件外部访问。 ex2在上下文外部不存在。

(function() {
   var ex;
   try {
       throw new Error('blah');
   } catch(ex2) {
       var ab = 3;
       console.log('ex is here:', ex2.message);
   }
   console.log(ab);
   console.log(ex2);
   console.log('ex out here:', ex);

   return 'hi';
})()

在您的示例中,使用相同的名称创建了不同的变量,但作用域不同。如果发生这种情况,那么(在几乎所有语言中)将使用上下文中的“最深”变量。 如果您想通过挂接将错误排除在捕获之外,则可以:

(function() {
   try {
       throw new Error('blah');
   } catch(ex2) {
       var ex = ex2;
       console.log('ex is here:', ex2.message);           
   }
   console.log(ex.message);

   return 'hi';
})()

答案 1 :(得分:2)

此代码的行为如下

  (function() {
   var ex1;
   try {
       throw new Error('blah');
   } catch(ex2) {
       console.log('ex i here:', ex2);
   }
   console.log('ex out here:', ex1);

   return 'hi';
  })()

这是因为在捕获中声明的ex仅在捕获范围内可见,有关更多信息,visit


关于循环,在这些迭代中,js查找包含它的最接近作用域的变量“ i”声明,在这种情况下,该声明是父项,因此正在更改的变量“ i”是在以下位置声明的变量之所以开始,是因为在de loop内部没有变量声明。

答案 2 :(得分:1)

来自try ... catch statement

  

try块中引发异常时, exception_var (例如e中的catch (e))保存由throw语句。您可以使用此标识符来获取有关引发的异常的信息。该标识符是catch子句的本地标识符。也就是说,它是在输入catch子句时创建的,并且在catch子句完成执行之后,标识符不再可用。