未捕获的TypeError:this.method不是函数 - 节点js类导出

时间:2017-02-15 00:57:01

标签: javascript node.js electron rollup

我是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时,实际上会发生这种情况。我已经更新了代码。

1 个答案:

答案 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()做的是创建一个小的存根函数,它将保存对象值,然后使用该对象调用您的方法。