2

我在使用 JavaScript 和将函数作为另一个函数的参数传递时遇到了一些问题。

假设我们在一个班级里做这样的事情:

this.get('target').update(this.onSuccess, this.onFail);
  • 'target' 是一个 JavaScript 对象,它有一个名为 update() 的方法
  • 我正在调用此方法并将调用者类的两个方法作为参数传递

在该更新方法中发生了一些事情,当它完成时,该方法应该调用 onSuccess 方法或 onFail 方法。这看起来像:

update: function(onSuccess, onFail) {
  if(true) {
    onSuccess();
  } else {
    onFail();
  }
}

到目前为止,一切正常!但是在调用者类(调用更新方法的那个)中定义的那些成功/失败方法中,我使用了一个this指针:

onFail: function() {
  alert('Error: ' + this.get('target').error);  
}

这个指针会导致一些问题。它不指向最初定义该方法的类,而是指向“目标”对象。

我现在需要做的是在“目标”类中的 onSuccess / onFail 调用之前更新 this 指针,以使方法再次工作。但这由于“左侧分配无效”错误而不起作用。

这种情况的最佳做法是什么?有任何想法吗?提前谢谢!!!

干杯

4

3 回答 3

4

调用时有两种选择update()

  • javascript函数call()
  • javascript函数apply()

主要区别在于您如何将参数传递给它。但它们都允许范围/上下文注入。

您的代码应如下所示:

this.get('target').update.call(this, this.onSuccess, this.onFail);
于 2010-10-06T13:45:52.830 回答
3

您可以创建一个将函数“绑定”到某个对象(使用闭包)的函数,然后将这些绑定函数传递给处理程序:

function bind(obj, fun) {
   return function() {
      return fun.apply(obj, arguments);
   };
};

update(bind(this, this.onSuccess), bind(this, this.onFail));
于 2010-10-06T13:53:58.207 回答
1

要重定向它,您需要bind()在类中使用(或类似的)方法,Function几乎​​在所有 JavaScript 库中都可以找到:

if(!Function.prototype.bind){
    Function.prototype.bind = function(scope) {
      var _function = this;

      return function() {
        return _function.apply(scope, arguments);
      }
    }
}

现在做这样的事情:

update: function(onSuccess, onFail) {
  if(true) {
    onSuccess.bind(this)();
  } else {
    onFail.bind(this)();
  }
}

该机制在这里解释:Binding Scope in JavaScript

于 2010-10-06T13:52:00.930 回答