2014-10-29 131 views
1

我已經在JavaScript中做了這樣的功能:有沒有辦法從方法中獲取此/上下文?

var syncCall = function(cb, obj, fn) { 
    var params = []; 
    for(var i=3; i< arguments.length; i++) { 
     params.push(arguments[i]); 
    } 
    fn.apply(obj, params) 
     .onReject(function(result){ 
     console.error(result); 
     }) 
     .onFulfill(function(result){ 
      if(cb != undefined && cb != null) { 
      cb(result); 
      } 
     }); 
}; 

的問題是,我必須passs obj PARAM到syncCall function, to set proper context ofinside fn`當它被調用。

在我的情況下,fn始終是一個方法/函數,它存儲在obj屬性之一中。因此通常在執行例如obj.myFunctionname()時,myFunctionname內的this運營商參考obj。我想知道,如果我能採取這個事實的冒險。意,具有fn作爲參數來syncCall時,採取某種方式的上下文(其爲obj)並正確傳遞到apply()用作第一參數

+1

*這*是不是「背景」,它只是在通話或使用設置的參數*綁定*。如果你想調用* syncCall *作爲'obj.syncCall',這樣* this *內的函數是* obj *,然後將它添加到* Object.prototype *,所以你會做'obj.syncCall(cb,fn) '和'... fn.apply(this,param)...'。請注意,這樣做是不喜歡的,因爲它可以打破糟糕的寫入..循環。所以你可以有一個* Obj *構造函數並且有'Obj.prototype.syncCall'。 – RobG 2014-10-29 20:30:22

+0

@RobG我已經試過這個你完全正確的地方。我試圖通過原型擴展的對象有一些for..in構造,並開始表現出意想不到的同時有新的屬性/函數asyncCall。因此,我選擇了'thesebas'提出的解決方案,下面是 – BartoszK 2014-10-30 20:14:20

回答

1

如果(因此,從具有OBJ如syncCall()第二個輸入參數辭職)想要擺脫obj param fn應該是上下文(this)不可知的,因爲你應該能夠通過fn任何可調用的(例如,不使用這個的匿名函數),所以1)傳遞函數綁定到obj或2)將上下文保留爲is and call .apply w/o context param fn.apply(null, params)

1)如果調用obj的任何地方綁定fn:

syncCall(cb, fn.bind(obj)) 

2)如果所謂的obj上下文中留下FN爲是

obj = { 

fn: function(){ 
    // some logic to be done in syncCall 
}, 

someObjMethod: function(){ 
    syncCall(cb, this.fn); //here this == obj and will be inside syncCall 
} 
} 
+1

p.sub.0。按照慣例,cb是最後一個參數,所以在'syncCall'簽名中交換'syncCall(fn,cb)':) – thesebas 2014-10-30 09:14:45

相關問題