Javascript 将函数赋值给window.onerror是否比window.addEventListener更可取(';error';,callback)?

Javascript 将函数赋值给window.onerror是否比window.addEventListener更可取(';error';,callback)?,javascript,error-handling,Javascript,Error Handling,将函数分配给window.onerror似乎是开始处理页面代码错误的一种非常简单的方法。但是,重要的是要确保没有覆盖预先存在的错误处理程序,因此通常的做法是维护对先前值的引用,并将其作为新函数的一部分调用。例如: var old_onerror = window.onerror; window.onerror = function() { // do something if (old_onerror) { old_onerror(); } }; 我在网

将函数分配给
window.onerror
似乎是开始处理页面代码错误的一种非常简单的方法。但是,重要的是要确保没有覆盖预先存在的错误处理程序,因此通常的做法是维护对先前值的引用,并将其作为新函数的一部分调用。例如:

var old_onerror = window.onerror;
window.onerror = function() {
    // do something
    if (old_onerror) {
        old_onerror();
    }
};
我在网上找到的大多数文档/博客帖子等都建议我这样做。为什么他们不建议为
'error'
事件添加一个事件处理程序呢?这允许在触发其中一个事件时调用多个函数,并且不需要笨拙地维护对其他错误处理程序的引用

window.addEventListener('error', function() {/* do something */});

编辑:我考虑了以下内容,但是
窗口上的
错误
事件似乎是一个相当特殊的情况(例如,请参见JQuery(在该页面上搜索“onerror”))。我特别想了解为什么
onerror
似乎是一个特例。

出于历史原因,这些
窗口。onerror
是一个特例。其中大部分现在已经不存在了,我想你必须回到IE8去寻找一个需要它们的浏览器。大约十年前,IE6还是国王,它根本不支持
addEventListener
,许多事件只由一些浏览器支持或具有不同的名称。Web开发过去非常不一致,而且像
window.onerror
这样的旧方法也不少见

出于向后兼容的原因,
window.onerror
有点奇怪,因为订阅事件的两种方式使用不同的参数

因此,旧版
onerror
包含错误详细信息作为参数:

window.onerror = function(message, source, line, col, error) {
    ...

    return true; // This will prevent further event propagation
};
这仍然存在,所以已经存在的旧JS不会崩溃——浏览器设计师希望10年前的网站基本上仍能在其最新版本中工作

虽然(现在是最佳实践)事件侦听器将它们作为事件的属性:

window.addEventListener('error', e => {

    // Get the error properties from the error event object
    const { message, filename, lineno, colno, error } = e; 
});
后者要好得多,因为您不需要获取任何以前的侦听器,并且后续的侦听器(例如来自浏览器扩展的侦听器)不会意外地破坏您的侦听器。此外,如果您正在构建类似SPA的东西,您可以删除侦听器,在SPA中,您停留在一个页面上,只有一个
窗口
上下文

因此,要回答这个问题:

我在网上找到的大多数文档/博客帖子等都建议我这样做。为什么他们不建议为“error”事件添加一个事件处理程序呢

因为它们已经过时了。使文档保持最新是很困难的,JS的发展也很快。这个 您描述的
window.onerror
模式在一些需要支持极其过时的IE版本的公司环境中仍然是可以接受的折衷方案。对于绝大多数web用户来说,
addEventListener
方法要好得多

例如,请参见JQuery明显缺乏对它的支持(在该页面上搜索“onerror”


jQuery很古老。有些决定是在2006-2008年左右做出的,现在它永远无法改变,
.on
对事件所做的一些假设就是其中之一。jQuery的
.on
在2006年非常棒,因为我们不必担心不同浏览器的事件实现——它可以隐藏所有这些事件一个通用的界面。现在所有东西都使用
addEventListener
,因此您不需要它(它比
.on
上的
功能强大得多)是的,只要使用事件监听器就行了。事件处理程序只对古代浏览器有用。我曾考虑过@AndrewL的可能重复项,但
窗口上的
错误
事件似乎是一个相当特殊的情况(例如,请参见JQuery(在该页面上搜索“onerror”))。你能用
旧的onerror
技术发布一些网站链接吗?我想参数是:
消息、文件名、行号、列号、错误
没有
源代码
@07mm8欢呼声,在适当的事件处理程序中更正