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