2017-10-28 44 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它很難給出基於我們有的小代碼的特別提示... –