2011-07-14 29 views
0

具有重複多次的外/內功能。除了內部函數調用外,外部函數總是相同的,例如e.target.ffunc1()in javascript,在功能包裝器中保持範圍有問題

 
util.func1 = function(e, successFunc, failureFunc) { 
    e.target.ffunc1(function(err) { 
    if(!err && successFunc)  successFunc(); 
    else if(err && failureFunc) failureFunc(); 
    else if(err)     nonblockAlert(err); 
    }); 
} 
HTMLInputElement.prototype.ffunc1 = function(nextFunc) { ... } 

util.func2 = func... 
HTMLInputElement.prototype.ffunc2 = func... 

... 

試圖寫一個糖包裝來定義這些外部函數時使用。

已經嘗試了很明顯的:

 
util.wrapper = function(e, callFunc, successFunc, failureFunc) { 
     callFunc(function(err) { 
       if(!err && successFunc)  successFunc(); 
       else if(err && failureFunc) failureFunc(); 
       else if(err)     nonblockAlert(err); 
     }); 
} 
util.func1 = function(e, successFunc, failureFunc) { 
    util.wrapper(e. e.target.ffunc1, successFunc, failureFunc); 
} 

但這種失敗,因爲thisffunc1e.target,而是該事件,其中func1被響應。回想起來,這很有道理。

在關於如何編寫,保留e.target.ffunc1呼叫的範圍(?),即,當執行ffunc1包裝功能喪失,this是從外func1功能e.target

(聲明:我承認,很多人有很好的理由不要超載DOM元素,我尊重你的位置然而,。)


的解決方案,因爲每個人(除了我)似乎知道,是call

 
util.wrapperDB = function(e, callFunc, successFunc, failureFunc) { 
     callFunc.call(e.target, function(err) { 
       if(!err && successFunc)  successFunc(); 
       else if(err && failureFunc) failureFunc(); 
       else if(err)     nonblockAlert(err); 
     }); 
} 

回答

1

您是否嘗試過在函數對象上使用call()方法?即

func.call([this argument], arg1, arg2, ...); 

在您的代碼:

callFunc.call(e.target, function(err) { 
      if(!err && successFunc)  successFunc(); 
      else if(err && failureFunc) failureFunc(); 
      else if(err)     nonblockAlert(err); 
    }); 
+0

你釘了它 - 謝謝! –

+0

很高興我能幫忙:) –

0

有一件事可以幫助是JavaScript的call方法,它可以讓你在你想要什麼this被調用函數內部傳遞。例如:e.target.ffunc1.call(e.target)

當我開始工作時,我會更新更多細節。

更新:看起來像馬丁打敗了我。真高興你做到了!

+0

是 - 感謝。看似簡單 –