Javascript,在传递函数参数时保留此引用

时间:2013-01-22 15:58:25

标签: javascript object callback

我在一个对象的函数内部,我需要调用一个外部函数并将一个函数的引用传递给参数。最后一个函数参数多次使用关键字this,因此我需要将范围限定在我的对象中。我通过这样做解决了这个问题:

   MyObj.prototype.internalFunc= function(data){
       this.doSomethingWithReturnedData(data);
   };

   MyObj.prototype.doSomething= function(){
       var $this = this;
       externalFunction(this.someVar, function(data){ $this.internalFunc(data); });
   };

   var objInst = new MyObj();
   objInst.doSomething();

我想知道是否存在避免这种混乱var $this = this的事情。

我也是:

   //... (same as before)
   MyObj.prototype.doSomething= function(){
       var $this = this;
       externalFunction(this.someVar, this.internalFunc, this);
   };
   //... (same as before)

   function externalFunction(arg1, cbfunc, thisref){
       //bla bla things
       cbfunc.call(thisref, blablaData);
   };

但我也觉得它很乱。

我认为有更好的方法,我没有看到它!提前谢谢!

2 个答案:

答案 0 :(得分:2)

如果您使用的是最近的浏览器并且使用Function.bind,还有另外一个选项可供您使用。

这允许您创建已绑定到特定范围的函数。换句话说,它允许您在该函数内定义this将是什么。因此,你可以这样做。

MyObj.prototype.doSomething= function(){
   externalFunction(this.someVar, this.internalFunc.bind(this, data));
};

按照上面的链接滚动到底部,查看有关浏览器支持的信息。

修改

实际上,还有另一种选择,即使用众多库中的一个库和框架。任何值得它的盐将有bindhitchproxy或其他可用的。但是,所有这些都在完成本地JS方法,但它们通常提供有用的附加功能,使这种技术更有价值。

答案 1 :(得分:1)

this分配给局部变量很好而且很常见。

许多库通过提供返回包装函数并设置执行上下文的方法(例如, jQuery中的$.proxy(或underscore.js中的_.bind)。