Javascript 向addEventListener注册的事件存储在哪里?

Javascript 向addEventListener注册的事件存储在哪里?,javascript,Javascript,我从一页空白开始。如果我运行document.body.onclick我会得到null。如果我应用以下代码: document.body.onclick = function() { return "Click"; }; 当我运行document.body.onclick时,我得到function(){return“Click”}。这是有道理的!但是当我跑的时候 document.body.addEventListener("click", function() { return "Click

我从一页空白开始。如果我运行
document.body.onclick
我会得到
null
。如果我应用以下代码:

document.body.onclick = function() { return "Click"; };
当我运行
document.body.onclick时,我得到
function(){return“Click”}
。这是有道理的!但是当我跑的时候

document.body.addEventListener("click", function() { return "Click"; });
document.body.onclick
仍然是
null
,但当我运行
document.body.Click()时,输出是
“Click”


所以我的问题是,当使用
addEventListener
时,函数存储在哪里?
它存储在
主体的
事件
侦听器的实际列表(数组)中

元素中有一个用于其事件侦听器的函数引用列表。这些引用不在DOM中。触发事件时,浏览器必须遍历所有适当的元素,查找这些引用并按顺序运行它们

无论如何。。。在DOM看不到的背景下,有很多事情正在发生。整个事件系统就是其中之一。整个Javascript引擎本质上是一个大的对象树,用于当前加载的页面,都存储在神秘的内存中。它们通常通过使用
文档
窗口
接口访问,就像DOM一样。但是,正确注册的事件将位于存储在内存中的大型对象树中,这与DOM不同。只是关系密切。我将DOM视为这个大型对象树和HTML本身之间的接口或中间人

继续
onclick
仅限于DOM中的一个值或一个javascript字符串。实际上没有注册。因此,不是一个实际的事件侦听器。在这里,DOM有点像一个垫片,因为它支持
onclick
字符串作为事件运行。因此,当触发事件时,该字符串也会运行。通过浏览器,在正确的时间,神秘地。大致说来,可以说这是DOM的一部分,它通常会从HTML中填充所有类似这样的行内文本,以便通过
文档
访问它。但一般来说,它们只是存储为字符串,而不是树中的实际对象。这可能是DOM如此受欢迎的众多原因之一

addEventListener
实际上将其注册为真实事件,因此您可以:

  • 有倍数
  • 作为对象访问它们
  • 随意添加和删除它们
  • 选择事件传播方案
  • 在运行时控制事件传播本身
  • 让事件在第一次运行后自动删除自身

    。。。以及其他一些功能

对于同一事件,它们都是两个不同的事件侦听器。一个是使用
addEventListener
时的完整事件侦听器。另一个只是DOM中的一个文本字符串,浏览器将“在正确的时间”运行该字符串,而不是实际的完整事件侦听器


这个问题可能会给我们一些启示

.addEventListener
之间的主要区别在于
.onclick
设置一个事件处理程序来替换现有的事件处理程序。而不是
。addEventListener
向DOM元素添加多个事件处理程序
.addEventListener
是添加事件处理程序的现代方法。我不知道它们存储在哪里,但不在
onclick
中,因为onclick只保存一个值,而不是一个事件处理程序数组。您可以在此处阅读更多关于此的信息:


因此,答案是,通过获取
onlick

的值,您无法通过
.addEventListener
添加事件处理程序,它存储在某个地方,但是该存储没有DOM接口,您无法在javascript中访问它。看不到问题的答案,但可以使用查看事件侦听器。