event 是回调链中任何地方都可以访问的全局变量吗?

问题描述 投票:0回答:2

我只是在使用 DOM 和 Javascript 来玩弄事件侦听器,并且确实注意到了这一点:

function chained(msg) {
    console.log(msg, event);
}

function onClick() {
    chained('the body was clicked');
}

document.body.addEventListener('click', onClick);

现在有趣的事情......这将输出:

“主体被点击,(MouseEvent)”

然后我问,为什么?它如何传递事件对象而不在

chained
调用中发送事件对象?

function chained(msg) {
    console.log(msg, namedEventObj); //throw error namedEventObj is not defined
}

function onClick(namedEventObj) {
    console.log(event); //outputs (MouseEvent);
    console.log(nameEventObj); //outputs (MouseEvent);
    chained('the body was clicked');
}

document.body.addEventListener('click', onClick);

即使我将要在

onClick
函数上传递的事件 obj 声明为
namedEventObj
,它也仅适用于
onClick
而不适用于
chained
函数...我得到了这个,这对我来说是有意义的.. .但绝对不是可用于
event
函数的
chained
变量。

有人知道为什么会这样吗?

我唯一能想到的是,事件实际上是

window.event
,并且当某些事件调度和事件时它使自己可用......但这意味着如果同时调用,任何元素都可以获取该事件信息事件何时触发?

我使用的是 Chrome 11.0.x

javascript inheritance scope event-handling dom-events
2个回答
39
投票

可以通过

window.event
访问当前事件。仅使用
event
就隐式访问
window.event


0
投票

远古世界的恶魔

其中一个已被弃用/不再推荐但存在了数十年的东西。我不会相信

window.event
我的生活,但它非常一致,有时它使事件处理变得更加容易,为您节省了无数的参数来传递。

  • GPT4 为您提供避免它的建议,但知道它有效;
  • MDN 建议不要这样做,但对每个浏览器都显示“完全支持”;
  • CanIUse 警告弃用,但整个图表都是绿色的。

您可以安全地使用它,只要您有一个备用计划,以便他们从浏览器中删除此功能。准备一些易于应用的解决方法。 (如果您不想更改太多事件逻辑,可以在您自己的 myApp 对象中手动添加全局变量,甚至可以是

window
本身。)

© www.soinside.com 2019 - 2024. All rights reserved.