JavaScript为何能识别不同名称参数的事件对象?
疑问:事件回调中未定义的event参数为何能获取到事件对象?
每个写过JavaScript的开发者都熟悉事件机制,比如这段常见代码:
document.addEventListener("keydown", function(event) { console.log(event); });
我有个疑问:我并没有手动定义event这个参数,为什么回调函数能获取到事件对象?是因为addEventListener要求回调必须接收事件参数(不管参数叫什么),还是和keydown这类事件类型有关?
这是浏览器事件触发机制的固有逻辑,核心原因如下:
- 浏览器会自动传递事件对象:当你用
addEventListener绑定事件后,浏览器在触发该事件的瞬间,会自动创建对应事件类型的事件对象(比如KeyboardEvent对应keydown),并把这个对象作为第一个参数传递给你的回调函数。你写的event只是给这个传入的参数起了个名字,哪怕换成e、evt甚至完全不同的名称,浏览器依然会按规则把事件对象传进来。 - 和事件类型无关:不管你绑定的是
keydown、click、submit还是其他任何事件类型,只要是通过标准的addEventListener绑定的回调,浏览器都会遵循这个参数传递规则,和具体事件类型没有关系。 - 参数名不影响传参逻辑:哪怕你回调里不写参数名,浏览器还是会把事件对象作为第一个实参传入——比如你可以通过
arguments[0]在回调里拿到它:document.addEventListener("keydown", function() { console.log(arguments[0]); // 依然能拿到键盘事件对象 });
简单说就是:addEventListener的回调设计就是接收浏览器自动传入的事件对象作为第一个参数,这是标准API的约定,和你有没有显式写参数名无关。
内容的提问来源于stack exchange,提问作者Kasuna89
相关产品推荐
相关产品推荐

