0

在传统的事件注册模型中:

function foo(e){console.log(e.type)}
document.getElementById("#id").onclick=foo;//registered event handler

但在内联事件注册模型中:

<a href="#" onclick=foo(event)>clck</a>  

console.log(a.click)===function click(){foo(event)}

事件对象不能直接在函数foo中使用,而不是作为函数参数传递。由于在 click 函数中使用的事件对象不是由浏览器传递的,所以我们手动传递它。为什么在事件处理函数中传递事件对象不工作?

4

1 回答 1

2

由于在 click 函数中使用的事件对象不是由浏览器传递的,因此我们手动传递它。

这是不正确的。浏览器(至少兼容 W3C 的浏览器)将事件对象传递给事件处理程序。

相当于

onclick="foo()"

elem.onclick = function(event) {
    foo();
};

浏览器创建一个event作为第一个参数的函数,并使用属性的值作为函数的主体。

您必须将事件对象显式传递给,foo因为这就是 JavaScript 函数的工作方式。如果您在另一个函数中调用一个函数,则外部函数的参数不会自动传递给内部函数(这真的会让 IMO 感到困惑)。
更简单的例子:

function foo(a) {
    bar();
}

function bar(a) {
    alert(a); // will show `undefined`
}

foo(42);
于 2013-05-02T18:34:12.720 回答