Javascript代码仅在FireFox中的try-catch块中失败

Javascript code fails in try-catch block only in FireFox

本文关键字:try-catch 失败 中的 FireFox 代码 Javascript      更新时间:2023-09-26

请考虑以下代码:

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,有没有替代方案?

在这里,这是一个类似的问题,我做了一个总结:

  1. 您可以轻松地将函数"someFunction"声明从try-catch块中取出。

  2. 将 try 块的内容包装在即时函数中似乎可以恢复该行为:

    try {
      (function(){
        hello();
        function hello() { 
          alert("Hello world");
        }
      })
    } 
    catch (err) {
      alert(err);
    }
    
  3. Firefox
  4. 对函数语句的解释不同,显然它们破坏了函数声明的声明提升,因此 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/