我是node.js的新手,我正在尝试要求一个类。我使用https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes作为参考。但是,当我这样做时:
// talker.js
class Talker {
talk(msg) {
console.log(this.say(msg))
var t = setTimeout(this.talk, 5000, 'hello again');
}
say(msg) {
return msg
}
}
export default Talker
// app.js
import Talker from './taker.js'
const talker = new Talker()
talker.talk('hello')
我明白了:
talker.js:4未捕获的TypeError:this.say不是函数
应该说app.js是electron.js渲染器进程,并使用rollup.js进行捆绑
为什么会出现这种想法?
更新抱歉,我在输入伪代码时忘记添加一行。当我用回调调用setTimeout
时,实际上会发生这种情况。我已经更新了代码。
答案 0 :(得分:5)
您正在失去this
与方法的绑定。
从此改变:
setTimeout(this.talk, 5000, 'hello again');
到此:
setTimeout(this.talk.bind(this), 5000, 'hello again');
当您将this.talk
作为函数参数传递时,它需要this
并查找方法talk
并传递对该函数的引用。但是,它只传递对该函数的引用。您与this
中的对象不再有任何关联。 .bind()
允许您将引用传递给一个小的存根函数,该函数将跟踪this
并将您的方法称为this.say()
,而不仅仅是say()
。
如果你刚刚这样做,你可以看到同样的事情:
const talker = new Talker();'
const fn = talker.say;
fn();
这会产生同样的问题,因为将方法分配给fn
根本不会与talker
关联。它只是一个没有任何与对象关联的函数引用。事实上:
talker.say === Talker.prototype.say
.bind()
做的是创建一个小的存根函数,它将保存对象值,然后使用该对象调用您的方法。