2010-10-06 114 views
1

我在JavaScript中遇到了一些麻煩,並且傳遞了一個函數作爲另一個函數的參數。如何更新對象內部的JavaScript指針以指向另一個對象?

讓我們說我們是一類內,做這樣的事情:

this.get('target').update(this.onSuccess, this.onFail); 
  • 「目標」是一個JavaScript對象,有一個方法叫做更新()
  • 我打電話這沿着作爲參數

該更新方法的一些東西發生內,當它完成該方法應該調用的onSuccess法或onFail主叫類的方法,並通過拖方法-方法。這看起來像這樣:

update: function(onSuccess, onFail) { 
    if(true) { 
    onSuccess(); 
    } else { 
    onFail(); 
    } 
} 

到現在爲止,一切工作都很好!但那些成功/失敗的方法,在呼叫者類(上述更新方法調用之一)中定義的內部,我使用的一個這種指針:

onFail: function() { 
    alert('Error: ' + this.get('target').error); 
} 

,該指針會導致一些的問題。它並不指向最初定義方法的類,而是指向「目標」對象。

我現在需要做的是在onSuccess/onFail在'target'類內部調用之前更新this-pointer以使這些方法再次工作。但由於'無效的左側'錯誤,這不起作用。

這樣的場景的最佳做法是什麼?有任何想法嗎? thx提前!

歡呼

回答

3

可以創建一個函數,「結合」到一定對象的功能(使用閉合)並且比通過這些結合功能的處理程序:

function bind(obj, fun) { 
    return function() { 
     return fun.apply(obj, arguments); 
    }; 
}; 

update(bind(this, this.onSuccess), bind(this, this.onFail)); 
+0

THX,這解決了我的問題!我忘了提及,我不能在調用者類中做出任何更大的更改!所以我只傳遞'this-pointer'和目標類中的綁定內容。這工作得很好! – NATOR 2010-10-06 14:23:59

3

調用update()時,您有兩種選擇:

  • javascript函數call()
  • javascript函數apply()

主要區別在於你如何向它傳遞參數。但他們都允許範圍/上下文注入。

你的代碼應該是這個樣子:

this.get('target').update.call(this, this.onSuccess, this.onFail); 
1

要重定向這一點,你需要在Functionbind()(或類似)方法,如發現幾乎所有的JavaScript庫:

if(!Function.prototype.bind){ 
    Function.prototype.bind = function(scope) { 
     var _function = this; 

     return function() { 
     return _function.apply(scope, arguments); 
     } 
    } 
} 

現在做這樣的事情:

update: function(onSuccess, onFail) { 
    if(true) { 
    onSuccess.bind(this)(); 
    } else { 
    onFail.bind(this)(); 
    } 
} 

的機理說明如下:Binding Scope in JavaScript