请考虑以下代码:
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中我得到“someFunction未定义”。我在其他浏览器中获得“执行”。
有人可以解释为什么会这样吗?我花了一天的时间在互联网上搜索任何可以远程解释这个问题的资源。
假设我没有对try块中的代码进行任何控制,但我想捕获任何潜在的错误,以便仍然执行下面的代码。我认为try-catch块是解决方案,但由于它在FireFox的这种情况下不起作用,还有其他方法吗?
答案 0 :(得分:2)
Here,这是一个类似的问题,我做了一个总结:
您可以轻松地将函数“someFunction”声明放在try-catch块中。
在立即函数中包装try块的内容似乎可以恢复该行为:
try {
(function(){
hello();
function hello() {
alert("Hello world");
}
})
}
catch (err) {
alert(err);
}
Firefox以不同的方式解释函数语句,显然它们打破了函数声明的声明提升,因此Firefox与其他浏览器的工作方式不同。
答案 1 :(得分:1)
您可以找到有关ECMA规范here的更多详细信息。作为一般规则,块范围内的函数应始终在顶部定义。我之前从未遇到过这个问题,因为我一直遵循这个规则(可能是在早期被烧毁)。
您遇到的这个问题是因为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。将整个块包裹在Immediately Invoked Function Expression (IIFE)
中try {
(function() {
function someFunction() {
alert('Execute!');
}
somefunction(); // Works in all browsers
})();
}
catch(e) {
alert(a);
}