javascript - 这两个事件监听回调的添加方式有什么区别?函数 VS 箭头函数调用函数
问题描述
- 使用以下每种方法需要注意哪些结果?
- 如果我需要调用一个函数同时传递一个不是触发事件本身的参数,那么箭头函数方法会更好吗?
document.querySelector('#element').addEventListener('click', () => myFunction1(param1));
document.querySelector('#element').addEventListener('click', myFunction2);
解决方案
内联调用函数,例如
() => myFunction1(param1)
将要
myFunction1
不带 a元素的调用this
(如果您在顶层,this
则函数内部将是 window 对象或undefined
)myFunction
用参数调用param1
而不是点击事件的参数
当您想要引用侦听器在侦听器内部附加到的元素时,第二种方法有时用作速记,例如:
function myFunction2() {
this.remove();
}
document.querySelector('#element').addEventListener('click', myFunction2);
<button id="element">click</button>
要在第一种方法中做同样的事情,您要么必须#element
先将 保存在一个变量中,要么使用 再次选择它querySelector
。
如果我需要调用一个函数同时传递一个不是触发事件本身的参数,那么箭头函数方法会更好吗?
是的,这是一种非常常见的做法。
另一种方法是创建一个高阶函数,如下所示:
const makeMyFunction1 = (param) => () => console.log(param);
document.querySelector('#element').addEventListener('click', makeMyFunction1('foo'));
<button id="element">click</button>
另请记住,如果您希望以后能够删除侦听器,则必须使用命名函数:
function myFunction2() {
console.log('hi');
this.removeEventListener('click', myFunction2);
}
document.querySelector('#element').addEventListener('click', myFunction2);
<button id="element">click</button>
推荐阅读
- c# - 异步任务中的 ASP.NET EF Core 连接问题
- vbscript - 列出文件/子文件的名称、大小和创建日期?
- c# - clickonce 应用程序在调用服务时出现网关超时,但使用资源管理器可以访问该服务
- javascript - AddEventListener 在错误的时间工作
- docker - 容器无法连接到 docker-compose 中的 microsoft sql server
- c++ - ia 不留眼睛 Player ue4 C++
- api - 如何读取 RDD 元素(字典格式的列表)并将其转换为 Pyspark API 可读的元组?
- microsoft-graph-api - Power Automate HTTP 错误 - {\"ErrorCode\":\"Forbidden\",\"Message\"
- sdk - Genexus Extensions SDK - 如何收听知识库对象焦点/选择?
- vagrant - 更新 Vagrant 后运行命令“vagrant up”时出现错误?