我在回調函數工作時遇到了一些麻煩。這裏是我的代碼:使用Javascript回調的範圍界定問題
SomeObject.prototype.refreshData = function()
{
var read_obj = new SomeAjaxCall("read_some_data", { }, this.readSuccess, this.readFail);
}
SomeObject.prototype.readSuccess = function(response)
{
this.data = response;
this.someList = [];
for (var i = 0; i < this.data.length; i++)
{
var systemData = this.data[i];
var system = new SomeSystem(systemData);
this.someList.push(system);
}
this.refreshList();
}
基本上SomeAjaxCall正在做一個數據的ajax請求。如果它有效,我們使用回調'this.readSuccess',如果失敗'this.readFail'。
我已經知道SomeObject.readSuccess中的'this'是全局的(又稱窗口對象),因爲我的回調被稱爲函數而不是成員方法。我的理解是,我需要使用閉包來保持'這個',但是,我還沒有能夠得到這個工作。
如果有人能夠告訴我我應該做什麼,我會非常感激。我仍然圍繞着關閉如何工作,特別是他們如何在這種情況下工作。
謝謝!
的確,這裏發生的是'obj'被鎖定在'function(){obj.readSuccess(); ''被評估。除非你使用像Prototype或jQuery這樣的庫,否則沒有其他辦法可以做到這一點;它們有一個'.bind()'函數,可以透明地完成閉包創建。 – MvanGeest 2010-06-09 13:09:27
不要挑剔,但爲了StackOverflow後代的緣故,jQuery版本被稱爲「代理」,而不是「綁定」。 – Pointy 2010-06-09 13:15:52
非常有意義。 jQuery代理函數的工作原理很好。 但是,爲了完整性,我仍然有點困惑,如果我不使用jQuery,我會如何處理這個問題。在我的例子中,readSuccess有1個參數respnse,它在以後填充。所以說我沒有意義說function(){obj.readSuccess(wah ??); }因爲哇?應該在晚些時候通過。 我試過function(){obj.readSuccess; }沒有運氣。有什麼想法嗎? – nazbot 2010-06-09 16:12:05