Javascript 事件是一个全局变量,在回调链中的任何地方都可以访问吗?

Javascript 事件是一个全局变量,在回调链中的任何地方都可以访问吗?,javascript,inheritance,scope,event-handling,dom-events,Javascript,Inheritance,Scope,Event Handling,Dom Events,我只是在玩弄DOM和Javascript的事件侦听器,并注意到: function chained(msg) { console.log(msg, event); } function onClick() { chained('the body was clicked'); } document.body.addEventListener('click', onClick); 现在有趣的是…这将输出: 已单击正文,(MouseEvent) 然后我问,为什么?它如何传递事件对

我只是在玩弄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
函数可用……我得到了这个,这对我来说是有意义的……但肯定不是
chained
函数可用的
事件
变量功能

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

我唯一能想到的是,事件实际上是
窗口。event
,当一些事件分派和事件发生时,它使自己可用……但这意味着,如果在触发事件的同时调用任何元素,它都可以获得该事件信息


我使用的是Chrome 11.0.x

用户可以通过
窗口访问当前事件。仅使用
事件
即隐式访问
窗口。事件

可以通过
窗口访问当前事件。事件
。仅仅使用
事件
就是隐式访问
窗口。事件

,不知道还有什么要说的。当然,你可以从任何地方访问全局变量(这就是为什么它们是全局的)。谢谢Felix,我同意我只是觉得创建这个“快捷方式”有点混乱,因为当你使用
函数(事件)
您认为您正在发送,而不是它已经自动发送,不要给人这样的印象,即它将通过所有链接功能传播。因此,我相信
window.event
很容易理解为全局的…但不是
event
,它在大多数情况下与您传递的属性名称一致,但这无法完成,因为所有内容都已在窗口内…并继承:(刚刚检查了Gecko tho中没有出现这种情况,但WebKit仍然存在,这可能会让人困惑。但是,如果当前函数中没有名为
event
的参数或变量,则您知道它必须来自更高的范围(在本例中为
window
)。如果您将其作为
事件
传递,那么您实际上是在访问参数,而不是
窗口。事件
。因此它只是函数的工作方式:)我现在已经习惯了:),它似乎是交叉浏览功能的一个很好的替代方案,因此您可以保证它也可以在旧版本的IE上工作,也许?谢谢你的启发,菲利克斯。关于跨浏览器兼容性:您经常会看到定义为
function(event){event=event | | | window.event;}
的事件处理程序。只有在未定义
event
的情况下(对于较旧的IE浏览器),才会使用
window.event
<代码>窗口。事件
在Firefox中不起作用。不知道还有什么要说的。当然,你可以从任何地方访问全局变量(这就是为什么它们是全局的)。谢谢Felix,我同意我只是觉得创建这个“快捷方式”有点混乱,因为当你使用
函数(事件)
您认为您正在发送,而不是它已经自动发送,不要给人这样的印象,即它将通过所有链接功能传播。因此,我相信
window.event
很容易理解为全局的…但不是
event
,它在大多数情况下与您传递的属性名称一致,但这无法完成,因为所有内容都已在窗口内…并继承:(刚刚检查了Gecko tho中没有出现这种情况,但WebKit仍然存在,这可能会让人困惑。但是,如果当前函数中没有名为
event
的参数或变量,则您知道它必须来自更高的范围(在本例中为
window
)。如果您将其作为
事件
传递,那么您实际上是在访问参数,而不是
窗口。事件
。因此它只是函数的工作方式:)我现在已经习惯了:),它似乎是交叉浏览功能的一个很好的替代方案,因此您可以保证它也可以在旧版本的IE上工作,也许?谢谢你的启发,菲利克斯。关于跨浏览器兼容性:您经常会看到定义为
function(event){event=event | | | window.event;}
的事件处理程序。只有在未定义
event
的情况下(对于较旧的IE浏览器),才会使用
window.event
<代码>窗口。事件在Firefox中不起作用。@redgetan如何在Firefox中使用事件?@kendotwill事件处理程序将被传递一个作为event@redgetan你,先生!是救命稻草。@redgetan如何在firefox中使用事件?@kendotwill事件处理程序将被传递一个作为event@redgetan你,先生!你是救命恩人。