catch 语句中没有提升?

No hoisting in catch statement?

我有这个代码:

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

   return 'hi';
})()

此记录:

ex i here: Error('blah');

ex out here: undefined

为什么会这样?我认为由于提升,ex 会设置在此块范围之外,因此它应该在 ex out here.

中可用

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

for (i=0; i<2; i++) {
}
console.log(i); // gives 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';
  })()

那是因为在 catch 中声明的第二个 ex 只对 catch 的范围可见,更多信息visit


关于循环,在那些迭代中,js 寻找包含它的最近范围的变量 "i" 声明,在本例中是父级,因此变量 "i" 即changing 是在开始时声明的,因为 de loop 中没有变量声明。

你把事情搞砸了。

定义为 var 的变量具有函数作用域。 catch中的参数没有提升,它有块作用域(只在那个catch部分)。

正如你在这个例子中看到的: ab 被提升,然后可以在 catch 部分之外访问。 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';
})()

在您的示例中,创建了具有相同名称但作用域不同的不同变量。如果发生这种情况,那么(在几乎所有语言中)都会使用上下文中的 "deepest" 变量。 如果你想通过托管将错误排除在 catch 之外,你可以:

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

   return 'hi';
})()

来自 try ... catch statement:

When an exception is thrown in the try block, exception_var (e.g., the e in catch (e)) holds the value specified by the throw statement. You can use this identifier to get information about the exception that was thrown. This identifier is local to the catch clause. That is, it is created when the catch clause is entered, and after the catch clause finishes executing, the identifier is no longer available.