为什么forEach及点击事件不传button、e参数时JS函数无法正常运行
关于这段JavaScript代码的参数问题解答
你遇到的问题本质是两个不同作用的参数的接收逻辑问题,分开解释:
1. forEach回调中的button参数
Array.prototype.forEach在遍历数组时,会自动给回调函数传入三个参数:当前遍历到的元素、当前索引、被遍历的数组本身。你代码里写的button就是用来接收第一个参数——也就是当前循环到的按钮DOM元素的。
如果你不写这个参数,回调函数内部就没有变量可以拿到当前正在遍历的按钮,自然没法给对应的按钮绑定点击事件,功能直接失效。
补充:如果你不想写
button参数也可以用回调的第二个参数索引去取btns[index],但写法远不如直接接button参数清晰。
2. 点击事件回调中的e参数
浏览器触发DOM绑定的点击事件时,会自动生成一个包含事件所有相关信息的事件对象,作为唯一参数传给绑定的事件处理函数。你代码里写的e就是用来接收这个事件对象的。
你代码里用到了e.currentTarget来获取绑定当前点击事件的按钮元素,如果不写e参数,函数内部的e就是未定义变量,运行到e.currentTarget时会直接抛出引用错误,后续逻辑自然不会执行。
补充:你理解的「绑定到元素上就自动指向对应元素」是成立的,普通函数作为事件处理函数时,内部的
this默认就指向绑定事件的DOM元素。你把代码改成下方写法,不写e参数也能正常运行:
const btns = document.querySelectorAll('.question-btn'); btns.forEach(function(button){ button.addEventListener('click', function(){ const question = this.parentElement.parentElement; question.classList.toggle('show-text'); }) });
内容的提问来源于stack exchange,提问作者BadControl Hypnos
相关产品推荐
相关产品推荐

