JS:为什么 Event 对象可以在事件处理程序中访问而无需在参数中接受它?

JS: Why is the Event object accessible in event handlers without accepting it in a parameter?

在回顾我过去写的一些 JS 时,我注意到我试图在事件处理程序中访问 event.keyCode,但我的函数的唯一参数是 e,而不是event。因此,虽然我希望得到 "Uncaught ReferenceError: event is not defined",但我发现我的脚本按预期工作(至少在 Chrome)。

document.body.addEventListener('keyup', function(e) {
    if (event.keyCode === 13) {
        // ...
    }
});

事实上,如果我在该处理程序中放置一个 console.log(e === event),我会得到 true。 经过一些测试(在 a JS Bin) it seems like this must apply to every such event, making event another sort of "sly" local variable like arguments 中出现在函数中而不在参数中请求它。

这让我想知道:

  1. 这是仅有的两个 "sly" 局部变量吗?
  2. Chrome 中 event 的这种行为是否与其他浏览器和 JS 环境一致?

根据浏览器,有一个全局 event 变量引用当前触发的事件。