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

Uncaught TypeError: this.method is not a function - Node js class export(未捕获的类型错误:this.method 不是函数 - 节点 js 类导出)
本文介绍了未捕获的类型错误:this.method 不是函数 - 节点 js 类导出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我是 node.js 的新手,我正在尝试要求一个类.我用过 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes 作为参考.但是,例如,当我这样做时:

I am new to node.js and I am trying to require a class. I have used https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes as reference. However, when I do this for example:

// 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 不是函数

talker.js:4 Uncaught TypeError: this.say is not a function

应该说app.js是electron.js的渲染进程,使用rollup.js捆绑

It should be said that app.js is the electron.js renderer process and it bundled using rollup.js

任何想法为什么会这样?

Any ideas why this would be?

更新:抱歉,我在输入伪代码时忘记添加一行.当我用回调调用 setTimeout 时,它实际上会发生.我已经更新了代码.

Update: Sorry, I forgot to add in a line when putting in the psuedo code. It actually happens when I call setTimeout with callback. I have updated the code.

推荐答案

你正在失去 this 对你的方法的绑定.

You are losing the bind of this to your method.

从此改变:

setTimeout(this.talk, 5000, 'hello again');

到这里:

setTimeout(this.talk.bind(this), 5000, 'hello again');

<小时>

当您将 this.talk 作为函数参数传递时,它接受 this 并查找方法 talk 并传递对该方法的引用功能.但是,它只传递对该函数的引用.与您在 this 中的对象不再有任何关联..bind() 允许您将引用传递给一个小存根函数,该函数将跟踪 this 并将您的方法称为 this.say(),而不仅仅是 say().


When you pass this.talk as a function argument, it takes this and looks up the method talk and passes a reference to that function. But, it only passes a reference to that function. There is no longer any association with the object you had in this. .bind() allows you to pass a reference to a tiny stub function that will keep track of this and call your method as this.say(), not just as say().

如果你这样做,你会看到同样的事情:

You can see the same thing if you just did this:

const talker = new Talker();'

const fn = talker.say;
fn();

这会产生同样的问题,因为将方法分配给 fn 根本不会与 talker 关联.它只是一个函数引用,与对象没有任何关联.事实上:

This would generate the same issue because assigning the method to fn takes no associate to talker with it at all. It's just a function reference without any association with an object. In fact:

talker.say === Talker.prototype.say

.bind() 所做的是创建一个小的存根函数,该函数将保存对象值,然后使用该对象调用您的方法.

What .bind() does is create a small stub function that will save the object value and will then call your method using that object.

这篇关于未捕获的类型错误:this.method 不是函数 - 节点 js 类导出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Google apps script get range of bytes from binary file(谷歌应用程序脚本从二进制文件中获取字节范围)
Sending Multiple attachments with Google Script from Google Drive(使用 Google 脚本从 Google Drive 发送多个附件)
Distributing Google Apps Scripts for Sheets in your company network(在您的公司网络中分发适用于表格的 Google Apps 脚本)
Upload file to my google drive from anyone using javascript(使用 javascript 将文件从任何人上传到我的谷歌驱动器)
quot;Shared Drivequot; support in Google Apps Script(“共享驱动器Google Apps 脚本中的支持)
Angular 2+ HTTP POST and GDrive API. Resumable file upload with name(Angular 2+ HTTP POST 和 GDrive API.带名称的可恢复文件上传)