Javascript 从异步函数访问时未定义的函数

Javascript 从异步函数访问时未定义的函数,javascript,Javascript,我不明白,为什么当我将一个函数设置为一个对象实例时,无论何时从某个异步对象(如setTimeout或promise)访问它,它都是未定义的。有人能解释一下吗?有解决办法吗 谢谢 function Animal() { this.check = function () { writeln(typeof this.test); } setTimeout(this.check, 1000); // returns undefined } var animal

我不明白,为什么当我将一个函数设置为一个对象实例时,无论何时从某个异步对象(如setTimeout或promise)访问它,它都是未定义的。有人能解释一下吗?有解决办法吗

谢谢

function Animal() {
    this.check = function () {
        writeln(typeof this.test);
    }
    setTimeout(this.check, 1000); // returns undefined
}

var animal = new Animal();
animal.test = function () {

}
animal.check(); // returns function

因为你在这里失去了背景:

setTimeout(this.check, 1000);
因此,
内部的
检查
将是
窗口
,它没有
测试
属性。也许你会:

setTimeout(this.check.bind(this), 1000);

旁注:动态分配函数是性能杀手,因此风格不好。总有更好的方法…

因为你在这里失去了上下文:

setTimeout(this.check, 1000);
因此,
内部的
检查
将是
窗口
,它没有
测试
属性。也许你会:

setTimeout(this.check.bind(this), 1000);

旁注:动态分配函数是性能杀手,因此风格不好。总有更好的方法……

您的问题可以简化为:
函数a(){this.x=42;this.foo=function(){console.log(this.x);};};}var obj=new a();var f=obj.foo;f()您的问题可以简化为:
函数A(){this.x=42;this.foo=function(){console.log(this.x);};};}var obj=new A();var f=obj.foo;f()
@melpoleme谢谢,很抱歉覆盖了您的更改/谢谢,我现在明白了。我正在使用nativescript,从自制对象触发事件时遇到问题。当某些事情发生时,我需要触发ui更新。我认为这是一个解决办法。@jacklin基于我们的小代码,很难给出一个特定的建议……我有一个类似Animal的对象,它通过返回承诺的函数与sqlite对话。我想在resolve promise中触发一个事件或调用这样的函数,这将触发另一个处理ui的文件中的函数,以便它可以重新加载。@jacklin那么您的解决方案是可以接受的,但是我更喜欢EventListener模式,如:
animal.on(“更新”,function(){…})
@melpoleme谢谢,很抱歉覆盖了您的更改/谢谢,我现在明白了。我正在使用nativescript,从自制对象触发事件时遇到问题。当某些事情发生时,我需要触发ui更新。我认为这是一个解决办法。@jacklin基于我们的小代码,很难给出一个特定的建议……我有一个类似Animal的对象,它通过返回承诺的函数与sqlite对话。我想在resolve promise中触发一个事件或调用这样的函数,这将触发另一个处理ui的文件中的函数,以便它可以重新加载。@jacklin那么您的解决方案是可以接受的,但是我更喜欢EventListener模式,如:
animal.on(“更新”,function(){…})