Node.js中如何在对象内部函数中通过setTimeout调用自身方法?
解决setTimeout调用对象方法时的this指向问题
嘿,这个问题我之前也踩过坑,核心原因是setTimeout会改变this的指向,咱们来拆解下你的问题,再给出可行的解决方案:
为什么你的几种写法都无效?
setTimeout(attack, 1000):这里的attack是未定义的全局变量,因为你的attack是entity对象的方法,不是全局函数,所以会直接报错。setTimeout(this.attack, 1000):当你把this.attack单独传递给setTimeout时,函数和原对象的关联就断开了,此时函数内部的this会指向全局对象(浏览器里是window,Node.js里是global,严格模式下是undefined),自然无法调用到实例的attack方法。setTimeout(this, 1000):setTimeout的第一个参数如果是对象,会默认调用它的toString()方法,而不是执行你的attack函数,所以完全达不到预期效果。
可行的解决方案
这里有三种常用的方法,都能帮你正确绑定this:
1. 使用箭头函数(最简洁)
箭头函数不会创建自己的this,它的this继承自外层作用域(也就是attack函数里的this),写法非常直观:
exports.entity = { name:"Foo", //其他属性... start:function() { this.attack(); }, attack:function() { setTimeout(() => { this.attack(); }, 1000); } }
2. 提前保存this到变量
在attack函数里把当前的this赋值给一个变量(比如self),然后在setTimeout的回调里用这个变量调用方法:
exports.entity = { name:"Foo", //其他属性... start:function() { this.attack(); }, attack:function() { const self = this; setTimeout(function() { self.attack(); }, 1000); } }
3. 使用bind方法绑定this
通过bind方法把attack函数的this强制绑定到当前实例,再传递给setTimeout:
exports.entity = { name:"Foo", //其他属性... start:function() { this.attack(); }, attack:function() { setTimeout(this.attack.bind(this), 1000); } }
这几种方法都能实现你想要的“在attack内部通过setTimeout调用自身”的效果,选哪种看你的代码风格习惯就好~
内容的提问来源于stack exchange,提问作者user8943533
相关产品推荐
相关产品推荐

