Uncaught TypeError:this.method不是一个函数 – Node js class export
我是新的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 Uncaught TypeError:this.say不是一个函数
应该说,app.js是electron.js渲染器进程,它使用rollup.js
任何想法,为什么这将是?
更新:对不起,我忘了添加在伪代码中添加一行。 实际上,当我用callback调用setTimeout
时会发生这种情况。 我已经更新了代码。
你正在失去对你的方法的束缚。
由此改变:
setTimeout(this.talk, 5000, 'hello again');
对此:
setTimeout(this.talk.bind(this), 5000, 'hello again');
当你把this.talk
作为一个函数parameter passing的this.talk
,它需要this
函数来查找方法talk
并且传递一个对这个函数的引用。 但是,它只传递了该函数的引用。 与你所拥有的物品不再有任何关联。 .bind()
允许你将一个引用传递给一个很小的stub函数, this
函数会跟踪this
函数,并把你的方法调用this.say()
,而不仅仅是say()
。
你可以看到同样的事情,如果你只是这样做:
const talker = new Talker();' const fn = talker.say; fn();
这会产生同样的问题,因为将该方法分配给fn
根本不需要与之talker
。 这只是一个函数引用,与对象没有任何关联。 事实上:
talker.say === Talker.prototype.say
.bind()
所做的是创build一个小的stub函数,它将保存对象值,然后使用该对象调用您的方法。