2017-10-28 51 views
1

我不明白,为什么当我设置一个函数的对象实例,每当它从异步访问,如setTimeout或承诺,它是未定义的。有人可以解释吗?有没有解决方法?从异步函数访问未定义的函数

感谢

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 
+0

你的问题可以简化为:'function A(){this.x = 42; this.foo = function(){console.log(this.x); }; } var obj = new A(); var f = obj.foo; f();' – melpomene

回答

0

因为你在这里失去语境:

setTimeout(this.check, 1000); 

因此,因此thischeckwindow,其中没有一个test财产。也许这样做:

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

边注:有动态分配功能是性能杀手,因此不良作风。总是有更好的办法...

+0

@melpoleme谢谢,对不起,重写您的更改;/ –

+0

谢谢我现在得到它。我正在使用本地脚本,并且无法从自制对象发起事件。当某些事情发生时,我需要触发UI更新,我认为这是一种解决方法。 –

+0

@jacklin它很难给出基于我们有的小代码的特别提示... –