【发布时间】:2023-03-15 05:58:01
【问题描述】:
我正在经历 JavaScript30 挑战,在 lesson 3 中,他有一些事件监听器调用一个函数,该函数引用它作为 this 调用的元素:
const inputs = document.querySelectorAll('.controls input');
function handleUpdate() {
const suffix = this.dataset.sizing || '';
document.documentElement.style.setProperty(`--${this.name}`, this.value + suffix);
}
inputs.forEach(input => input.addEventListener('change', handleUpdate));
inputs.forEach(input => input.addEventListener('mousemove', handleUpdate));
我正在尝试使用 ES6 箭头函数重写它,但我无法让 this 正常工作。我有一个使用target 的解决方法:
const handleUpdate = (e) => {
const that = e.target;
const newValue = `${that.value}${that.dataset.sizing || ''}`;
etc.
}
但我首先尝试像这样绑定函数:
input.addEventListener('change', handleUpdate.bind(this));
但是函数内部的this仍然指向window,我不明白为什么。
在这种情况下是否没有“正确”的方式将函数绑定到元素?
【问题讨论】:
-
如果你想使用
this那么你需要使用常规函数。箭头函数不能真正与this一起正常工作。 -
另外,有没有正确的方法来使用箭头函数呢? 没有
-
我想我记得读过一些东西说或建议,明确编写箭头函数是为了避免影响“this”。
-
普通函数和
this或e.currentTarget(不是e.target!!) -
箭头函数只允许从定义它们的环境继承'this'的值,而不是它们被调用的上下文。演示代码使用常规函数,'this'引用调用它的环境。根据定义,箭头函数不可能做到这一点,因此为什么不能在需要使用“this”的任何地方使用它们。
标签: javascript this