我在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 );
}
});
};
问题是,我必须在调用它时将obj
param传递给syncCall function, to set proper context of
这个inside
fn`。
就我而言,fn
始终是一个方法/函数,存储在obj
个属性之一中。因此,通常在执行obj.myFunctionname()
时,this
内的myFunctionname
运算符会引用obj
。我想知道,如果我能冒这个事实的冒险。这意味着,当fn
作为syncCall
的参数时,以某种方式获取上下文(obj
)并将其正确地传递给apply()
函数作为第一个参数(因此,辞职)从obj作为syncCall()
)
答案 0 :(得分:1)
如果你想摆脱obj param fn应该是context(this)不可知因为你应该能够以fn
传递任何可调用的(例如不使用它的匿名函数)所以1)传递函数绑定到obj或2)保持上下文不变并调用.apply w / o context param fn.apply(null, params)
:
1)如果在任何地方调用fn到obj:
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
}
}