javascript - 在 foreach 循环中转换为箭头函数会导致 TypeError
问题描述
我有这个代码块,用于将事件侦听器绑定到每个带有#
href 的锚标记。我决定将事件侦听器的回调函数转换为箭头函数,但是虽然原始代码有效,但修改后的代码会导致错误:TypeError: undefined has no properties
. 我以前多次使用过箭头回调函数,它们确实工作得很好。是什么让它在这种情况下破裂?
有效的原始代码:
document.querySelectorAll('a[href^="#"]').forEach((anchor) => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
document.querySelector(this.getAttribute('href')).scrollIntoView({
behavior: 'smooth',
});
});
});
断箭回调函数:
document.querySelectorAll('a[href^="#"]').forEach((anchor) => {
anchor.addEventListener('click', (e) => {
e.preventDefault();
document.querySelector(this.getAttribute('href')).scrollIntoView({
behavior: 'smooth',
});
});
});
编辑:我解决了这样的问题,但我仍然无法弄清楚这两者有何不同
document.querySelectorAll('a[href^="#"]').forEach((anchor) => {
anchor.addEventListener('click', (e) => {
e.preventDefault();
anchor.scrollIntoView({
behavior: 'smooth',
});
});
});
或者:
document.querySelectorAll('a[href^="#"]').forEach((anchor) => {
anchor.addEventListener('click', (e) => {
e.preventDefault();
e.target.scrollIntoView({
behavior: 'smooth',
});
});
});
解决方案
问题是因为this
在你的函数里面使用。
根据MDN:
箭头函数表达式是正则函数表达式的语法紧凑替代方案,尽管它没有绑定到 this、arguments、super 或 new.target 关键字。
正如@Ben Aston 在评论中已经提到的,您可以更改this.getAttribute
为event.target.getAttribute
推荐阅读
- typescript - 如何使用 tsconfig 编译单个 TS 文件?可选在 ts-node?
- bash - 脚本bash递归合并目录并为公共文件执行函数
- javascript - 名称“JavaScript”是“ECMAScript”的不正确同义词吗?
- ldap - 带有 Impala 的 Apache Sentry - 分配给 LDAP 中组的角色不会反映
- sql-server - SQL_VARIANT 和 DATETIME2
- mysql - 如果为 NULL,MySQL 更新/连接列,使用来自其他列的数据
- php - 在 Kubernetes 中部署 Wordpress 的存储策略
- python - Python 国际象棋极小极大算法 - 如何玩黑棋(Bot 有白棋)
- r - 如何使用单个直方图演示样本均值的平均值
- node.js - 在 Cloud Function Shell 中使用 Express App 调用 HTTP 函数时如何传递参数