2014-10-29 106 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

相关问题