2013-03-25 54 views
2

今天我發現了一個相當奇怪的行爲,當您在Javascript中將函數的方法作爲函數傳遞時,會發生這種行爲。Javascript將對象的方法作爲函數傳遞

setTimeout(myObject.test, 100); // "this" is the global object window 

正確調用方法「test」,但「this」不是對象「myObject」而是全局對象「window」。當我做這樣的事情時,我可以得到預期的行爲:

setTimeout(function(){myObject.test()}, 100); // "this" is myObject 

這對我來說似乎很奇怪。有人可以解釋,爲什麼這是。

+1

你所描述可奇怪的是,當你使用像AS3或Java語言 - 但在JS這是預期的行爲,默認的作用域是任何事件或超時功能等的「窗口」。所以你通常必須經歷匿名功能。 – olsn 2013-03-25 09:25:28

回答

1

考慮這個僞表現如何JavaScript的將演繹setTimeout(myObject.test, 100);

function setTimeout(func, millisec) { 
    //some code... 
    func(); //"this" in func will point to window 
    //some code... 
} 

但是,當你做到這一點 - setTimeout(function(){myObject.test()}, 100);setTimeout將執行anonymou因爲this匿名函數仍然會指向window,但是那個匿名函數會調用另一個函數myObject.test(),因爲函數被稱爲對象的方法,所以this會指向那個對象。

你可以通過使用一個很酷的JS功能bind來解決這個問題。

setTimeout(myObject.test.bind(myObject), 100); //now "this" will point to myObject. 

一個更好的解釋是hereJS Guru

1

運行時間將執行上window對象setTimeout函數的參數(第一個參數),你直接把test方法作爲參數,所以你看this是債券,以窗口對象在第一種情況下。

在你的第二個情況下,window對象執行的功能是你的匿名函數function() { myObject.test() },但是,test方法被調用的myObject,這就是爲什麼你看到this是債券,以myObject

相關問題