try/catch语句是JavaScript语句提供的异常处理机制,一旦try语句块内部的语句抛出异常,在catch语句块即可捕获到Error类型的异常信息。我们知道JavaScript里是没有块作用域的,但是这个常识却在catch语句块里面得到了相反的现象。看如下代码:
(function(){ try{ throw new Error("error"); } catch(ex){ console.log(ex.message); } finally{ console.log("final"); } console.log(ex); })();
上述代码中最后一行控制台输出(console.log(ex); )将会抛出异常提示,没有ex这个标识符。这个现象表明,在catch语句块里,ex的作用域仅仅局限在语句块内部,外部将无法解析到ex这个标识符。
将上述代码做个小调整,在catch内部再次申明ex为变量。
(function(){ try{ throw new Error("error"); } catch(ex){ console.log(ex.message); var ex = "ex string"; } finally{ console.log("final"); } console.log(ex); })();
这个时候最后一行控制台输出(console.log(ex); )不抛异常了,但是他输出的却是undefined值,catch语句块里的赋值语句并没有作用到里面申明的ex变量上,而是给catch捕获的ex进行了赋值。这个现象很奇特,变量名解析的优先级被捕获异常的标识符覆盖。
时间: 2024-10-12 12:46:43