javascript - 在 JavaScript 中对事件调用类方法不会更改类属性
问题描述
考虑这段代码:
var states = {
"default" : {
foo: "foo",
mouseReleased: function() {
console.log("Mouse released");
this.foo = "bar";
}
}
}
var canvas = function(states) {
return {
states: states,
currentState: "default",
draw: function() {
if (this.states[this.currentState].mouseReleased != undefined) {
window.mouseReleased = this.states[this.currentState].mouseReleased
}
}
}
}
当我释放鼠标时,控制台显示“鼠标已释放”,但states.default.foo
不会更改为bar
. 有没有办法不使用window.mouseReleased
's this
?我已经阅读了一些关于 的内容bind
,但我不确定它是什么意思。我在正确的地方搜索吗?
解决方案
尽管共享代码在其他方面无效且非常不寻常,但它看起来确实是一个经典的函数绑定问题。
问题是this
关键字的含义在 Javascript 中有些不寻常。默认情况下,在函数体中,调用函数时this
将引用点左侧的对象。因此,例如:
let objectA = {
whoAmI: 'A',
sayA: function() {
console.log(this.whoAmI);
}
};
let objectB = {
whoAmI: 'B'
};
objectB.sayA = objectA.sayA;
// Logs 'A'
objectA.sayA();
// Logs 'B' because `this` now refers to `objectB`
objectB.sayA();
let defaultThis = objectA.sayA;
// This will log undefined because `this` defaults to the global scope, or `window`
defaultThis();
当bind()
您想要锁定this
. 因此,如果我有一个想直接用作事件处理程序的类方法,我将需要调用bind()
我想this
引用的对象:
let obj = {
state: 0,
handler: function() { console.log(this.state); this.state++; }
}
// This logs undefined, NaN, NaN, NaN because `this` will be `window` which does not have a `state` property
window.addEventListener('click', obj.handler);
// This logs 0, 1, 2, 3
window.addEventListener('click', obj.handler.bind(obj));
同样的原则也适用于 p5.js 事件处理函数。
推荐阅读
- sql - 为什么按日期排序 asc 不起作用?
- reactjs - Firebase Firestore 分页,使用文档快照或文档 ID 从左侧继续
- excel - 如何在Excel中找到多个项目的最大总和
- digital-persona-sdk - 获取并比较来自 Raw 的 FMD 或来自 JavaScript api 的图像
- javascript - 如何从 XLSX 创建 JSON 文件,但将一些值作为字符串数组
- mysql - jdbcTemplate.update 将参数发送到不同类型的存储过程
- c++11 - cuda如何拼接图像?
- c++ - 在 OneDrive For Business (OFB) 中的现有文件上使用 OPEN_ALWAYS 的 CreateFile 失败,因为 ERROR_ACCESS_DENIED
- stripe-payments - Opayo PI API 中的 CardIdentifer
- android - 它无法发出 http 请求,而 esp32 正确充当服务器,它也使用 WIFI 连接到手机