【问题标题】:Javascript, preserving this reference when passing function argumentJavascript,在传递函数参数时保留此引用
【发布时间】:2013-01-05 22:15:17
【问题描述】:

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

但我也觉得很乱。

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

【问题讨论】:

  • 通过将 this 引用分配给局部范围变量来保留它就可以了
  • 您已经确定了您的两个选择。没有其他选择。
  • 是的,为this 使用局部变量(在JS 中通常称为变量名that)很常见。此外,您还有使用绑定方法的包装库,例如下划线。见underscorejs.org/#bind
  • @ic3b3rg:这是不正确的。请参阅下面的答案。
  • @Dancrumb 对,你是……很高兴知道。

标签: javascript object callback


【解决方案1】:

如果您使用的是最新版本的浏览器,那么您还可以使用另一个选项,那就是使用Function.bind

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

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

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

编辑

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

【讨论】:

  • 我无法确定用户是否拥有“足够新的浏览器”,我也不想仅仅为了某些代码行而依赖某些外部库,但感谢您给我提供谷歌搜索的名称!
【解决方案2】:

this 分配给一个局部变量是正常且常见的。

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

【讨论】:

  • ty,现在我可以做到了,而不会觉得我做错了,也许以后我只会看到你告诉我的函数的代码,然后试着做我自己的小鬼!
猜你喜欢
  • 2012-05-29
  • 2019-11-22
  • 2021-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多