2011-08-31 173 views
1

爲什麼當我使用dojo.hitch函數並試圖引用裏面的「this」運算符時,它給了我引用錯誤的對象?Dojo.hitch()範圍問題

console.debug(dijit.byId("widgetName")); //works as expected and prints out the window object 

dojo.hitch(dijit.byId("widgetName"), tester())(); //this should be executing the tester function in the scope of the widget object 

function tester() { 
    console.debug(this); //prints out the Javascript Window object instead of the widget object!!!! 
} 

感謝

+0

這不應該發生,不要相信你發佈的內容與你在應用程序中嘗試的內容相同。任何scnreenshots支持它? – Layke

+1

如果你把'console.log(dijit.byId(「widgetName」))'放在'hitch'之前,你確定它能夠正確地返回嗎?它是否會返回null?在這種情況下,'this'指的是'window'。 – pimvdb

+0

@Layke我知道這不應該發生,因此我的問題。一段時間以來,我一直在撓頭。這是完全從我的應用程序複製/粘貼代碼。我不知道你想在截圖中看到什麼?! – Ayyoudy

回答

6

根據你剛纔表示什麼,我現在可以安全地提供答案解釋什麼是錯的。

當你做一個dojo.hitch()你不應該調用它的函數,而是調用函數的結果。也就是說,您需要提供dojo.hitch以引用該函數,而不是調用該函數的結果。

在你的榜樣,你在呼喚tester()(其中調用函數tester)的dojo.hitch(),它調用tester一次內部。即使您擁有dojo.hitch()();,因爲tester()未返回函數處理程序(但結果爲tester,在這種情況下爲undefined),因此hitch()();什麼也不做。這可能會令人困惑,所以我會給你一個例子。

不要這樣做:

dojo.hitch(背景下,處理程序())();

而是做到這一點:

dojo.hitch(上下文句柄)();

所以爲了讓你有非常可讀的你可以這樣做:

widget = dijit.byId("widgetName"); 
tester = function() { 
    console.log(this); 
} 

handle = dojo.hitch(widget, tester); 
handle(); 

你的錯誤是試圖從dojo.hitch()內調用該函數。您的原始問題中也沒有這個錯誤。

+0

謝謝。這似乎有幫助。但是如果我想將任何參數傳遞給測試者呢?即dojo.hitch(widget,test('myparam')); – Ayyoudy

+2

dojo.hitch()有一個我相信接受參數的第四個參數。無論是第四還是第三。我不記得了。查看具有如何通過dojo.hitch傳遞參數的dojo文檔。 – Layke

+0

這非常有幫助。謝謝! – Ayyoudy