4

我在一个对象的函数内部,我需要调用一个外部函数并将对函数的引用作为参数传递。最后一个函数参数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);
   };

但我也觉得它很乱。

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

4

2 回答 2

2

如果您使用的是最新的浏览器并且使用Function.bind.

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

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

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

编辑

实际上,还有另一种选择,即使用现有的众多库和框架之一。任何称职的人都会有bind, hitch,proxy或以其他方式提供给您。然而,所有这些都在封装原生 JS 方法,但它们通常提供有用的补充,使这项技术更加有价值。

于 2013-01-22T16:05:11.410 回答
1

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

许多库通过提供返回包装函数并设置执行上下文的方法(例如$.proxy在 jQuery 中(或_.bind在 underscore.js 中))使您的第二种方法更容易。

于 2013-01-22T16:03:47.637 回答