addEventListener中未显式传参的logKey为何能获取e.code?
事件回调的参数获取原理
你观察到的现象是DOM事件系统的标准行为,核心逻辑非常好理解:
- 调用
addEventListener传入logKey时,你只是把函数的引用交给浏览器存起来,并没有立刻执行这个函数,所以不需要手动加括号传参。 - 当你按下键盘、
keydown事件被触发时,浏览器会自动执行之前存好的logKey回调,执行时会自动把当前生成的键盘事件对象作为第一个参数传入函数——这个传参动作是浏览器内部按照Web标准完成的,不需要你在绑定监听的时候手动传入。
你可以把浏览器内部的事件触发逻辑近似理解为下面的伪代码,看完就通了:
// 浏览器内部运行逻辑(仅作原理演示,不是真实源码) function whenKeyDownHappens(/* 浏览器自己生成的事件对象 */ keyEvent) { // 挨个执行你之前绑定的所有keydown回调,自动把事件对象传进去 logKey(keyEvent); }
哪怕你定义回调的时候不写e这个形参,事件对象也照样会被传进来,只是你没有声明变量接收它而已,比如下面的写法同样能拿到按键code:
function logKey() { // 没写形参也能通过内置arguments拿到传入的第一个参数,也就是事件对象 log.textContent += ` ${arguments[0].code}`; }
内容的提问来源于stack exchange,提问作者Shivam Tanwar
相关产品推荐
相关产品推荐

