Javascript 无法读取回调时未定义问题的属性

Javascript 无法读取回调时未定义问题的属性,javascript,node.js,undefined,Javascript,Node.js,Undefined,我有一个非常简单的类,它包装了node.js串行端口类。在创建对象时,将创建一个新的记录器。当逐步执行时,一切似乎都很好-当我调用open时,我可以看到记录器是一个有效的记录器对象。但是,当错误方法由打开端口时的错误触发时,记录器不再定义-似乎回调和创建的对象存在一些问题,但我不知道是什么?谢谢你的帮助 编辑:我用TypeScript编写了这个类,我意识到这可能是一个非常烦人的经典JavaScript“this”问题……很抱歉,我对js还很陌生 "use strict"; var SerialP

我有一个非常简单的类,它包装了node.js串行端口类。在创建对象时,将创建一个新的记录器。当逐步执行时,一切似乎都很好-当我调用open时,我可以看到记录器是一个有效的记录器对象。但是,当错误方法由打开端口时的错误触发时,记录器不再定义-似乎回调和创建的对象存在一些问题,但我不知道是什么?谢谢你的帮助

编辑:我用TypeScript编写了这个类,我意识到这可能是一个非常烦人的经典JavaScript“this”问题……很抱歉,我对js还很陌生

"use strict";
var SerialPort = require('serialport');
const logger = require('../logger');
class MySerialPort {
    constructor() {
        this.log = new logger();
    }

    error(error) {
        console.log(error);
        try {
            this.log.log('Serial port error: ' + error);
        }
        catch (e) {
            console.log(e);
        }
    }

    open(commport) {
        this.port = new SerialPort(commport);
        this.port.on('data', this.dataRecieved);
        this.port.on('error', this.error);
        return true;
    }

    dataRecieved(data) {
        console.log(data.toString());
    }
}
module.exports = MySerialPort;

使用箭头函数或绑定此函数,任何一种方法都可以

this.port.on('error',(err)=>{this.error(err)})


使用箭头函数或绑定此函数,任何一种方法都可以

this.port.on('error',(err)=>{this.error(err)})


您应该在代码中放置一条注释,指出错误发生的位置。您不能在不丢失上下文的情况下将未绑定的方法作为回调传递。就这样。请参阅DavidIrnt关于如何绑定方法的回答。是的,谢谢!我对js知识的缺乏在这里得到了体现。谢谢有意义。您应该在代码中放置一条注释,指出错误发生的位置。如果不丢失上下文,则无法将未绑定的方法作为回调传递。就这样。请参阅DavidIrnt关于如何绑定方法的回答。是的,谢谢!我对js知识的缺乏在这里得到了体现。谢谢有道理,为什么是dv?事实上,这就是答案……不知道为什么会有否决票……我没有否决你。这是正确的。我想是因为有人疯了,我问了一个“这个”问题。。。无论如何,谢谢!我投了你一票,我会接受这个正确的答案。啊,是的……已经有答案了,我问了一些被问了很多的问题。我假设这是一个生成错误代码的TS问题,因此我没有搜索绑定回调的问题。在我提交问题后,我意识到这可能是问题所在,因此我进行了编辑。无论如何,谢谢你的帮助@Giallo甚至不是我的答案,我只是好奇为什么有人会dv,而不是标记为傻瓜。很高兴你的问题解决了。嗯,我对答案的原始形式投了反对票,因为它没有解释。我在修正案后退出了否决票,因为这个问题是一个非常明显的骗局,答案也是如此。我就这样关上了。为什么要用dv?事实上,这就是答案……不知道为什么会有否决票……我没有否决你。这是正确的。我想是因为有人疯了,我问了一个“这个”问题。。。无论如何,谢谢!我投了你一票,我会接受这个正确的答案。啊,是的……已经有答案了,我问了一些被问了很多的问题。我假设这是一个生成错误代码的TS问题,因此我没有搜索绑定回调的问题。在我提交问题后,我意识到这可能是问题所在,因此我进行了编辑。无论如何,谢谢你的帮助@Giallo甚至不是我的答案,我只是好奇为什么有人会dv,而不是标记为傻瓜。很高兴你的问题解决了。嗯,我对答案的原始形式投了反对票,因为它没有解释。我在修正案后退出了否决票,因为这个问题是一个非常明显的骗局,答案也是如此。我就这样关上了。
var error=this.error.bind(this);
this.port.on('error', error);