Javascript代码仅在FireFox中的try-catch块中失败
Javascript code fails in try-catch block only in FireFox
请考虑以下代码:
if (window.addEventListener) {
window.addEventListener('load', someFunction, false);
} else if (window.attachEvent) {
window.attachEvent('onload', someFunction);
}
function someFunction() {
alert('Execute!');
}
这适用于Chrome,FireFox,IE。我收到警报"执行!但是,如果我像这样将其包装在 try-catch 块中:
try{
if (window.addEventListener) {
window.addEventListener('load', someFunction, false);
} else if (window.attachEvent) {
window.attachEvent('onload', someFunction);
}
function someFunction() {
alert('Execute!');
}
}catch(e){
alert(e.message);
}
然后在FireFox中,我得到"某些功能未定义"。我在其他浏览器中得到"执行"。
有人可以解释为什么会这样吗?我花了一天时间在互联网上搜索任何可以远程解释这一点的资源。
假设我对 try 块中的代码没有任何控制权,但我想捕获任何潜在的错误,以便仍然执行低于的代码。我以为 try-catch 块将是解决方案,但由于它在这种情况下不适用于 FireFox,有没有替代方案?
在这里,这是一个类似的问题,我做了一个总结:
-
您可以轻松地将函数"someFunction"声明从try-catch块中取出。
-
将 try 块的内容包装在即时函数中似乎可以恢复该行为:
try { (function(){ hello(); function hello() { alert("Hello world"); } }) } catch (err) { alert(err); }
Firefox 对函数语句的解释不同,显然它们破坏了函数声明的声明提升,因此 Firefox 的工作方式与其他浏览器不同。
您可以在此处找到有关 ECMA 规范的更多详细信息。作为一般规则,块范围内的函数应始终在顶部定义。我以前从未遇到过这个问题,因为我一直遵循这个规则(也许是从早期被烧毁开始的(。
您面临的这个问题是因为 Firefox 在块作用域中实现功能提升的方式。您不仅会在 try-catch 中遇到这个问题,还会在 Firefox 中的任何块范围内遇到这个问题。
另一个块范围内的问题示例:
if(somevar==1) {
somefunction(); // Will fail in Firefox
function someFunction() {
alert('Execute!');
}
}
解决方法:
1. 将函数声明移动到块的开头
try {
function someFunction() {
alert('Execute!');
}
somefunction(); // Works in all browsers
}
catch(e) {
alert(e);
}
2. 将整个块包装在立即调用的函数表达式 (IIFE( 中
try {
(function() {
function someFunction() {
alert('Execute!');
}
somefunction(); // Works in all browsers
})();
}
catch(e) {
alert(a);
}
小提琴示例:http://jsfiddle.net/zz5mj7c2/6/
相关文章:
- errors with Javascript try catch
- JSON.parse,已经在try/catch块中,仍然抛出语法错误
- 在try-catch块内的HTML文件中导入JavaScript文件
- 有没有一种方法可以将try-catch添加到Javascript中的每个函数中
- Javascript Try Catch for DIV
- Safari 在尝试使用 Javascript try/catch 访问父窗口对象时未捕获异常
- 与在异步回调链中使用 try catch 块相比,返回异常有什么优势
- 在 Javascript 中,即使从未抛出异常,使用 try-catch 块是否昂贵
- JavaScript 中的 try-catch:如何获取原始错误的堆栈跟踪或行号
- 使用 try catch(e) 进行浏览器功能检测
- 了解 JavaScript 中的异常处理:当更改 try/catch 块的位置时,获得不同的输出
- 在 JavaScript 中用“try catch”包装每个方法的性能问题
- execScript try/catch in IE 8 中的怪异之处
- Javascript代码仅在FireFox中的try-catch块中失败
- 在 AJAX 响应中查找嵌套属性,这是 try/catch 的情况
- 使用 window.onerror 和 try-catch 块处理错误之间的差异
- 在声明变量时使用 try catch
- Try Catch在普通Android浏览器上失败
- JavaScript'的try-catch在类型错误上失败
- html5视频-为什么javascript中的try/catch在IE中失败