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进行了赋值。这个现象很奇特,变量名解析的优先级被捕获异常的标识符覆盖。