2010-10-06 111 views
1

我在JavaScript中遇到了一些麻烦,并且传递了一个函数作为另一个函数的参数。如何更新对象内部的JavaScript指针以指向另一个对象?

让我们说我们是一类内,做这样的事情:

this.get('target').update(this.onSuccess, this.onFail); 
  • “目标”是一个JavaScript对象,有一个方法叫做更新()
  • 我打电话这沿着作为参数

该更新方法的一些东西发生内,当它完成该方法应该调用的onSuccess法或onFail主叫类的方法,并通过拖方法-方法。这看起来像这样:

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

到现在为止,一切工作都很好!但那些成功/失败的方法,在呼叫者类(上述更新方法调用之一)中定义的内部,我使用的一个这种指针:

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

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

我现在需要做的是在onSuccess/onFail在'target'类内部调用之前更新this-pointer以使这些方法再次工作。但由于'无效的左侧'错误,这不起作用。

这样的场景的最佳做法是什么?有任何想法吗? thx提前!

欢呼

回答

3

可以创建一个函数,“结合”到一定对象的功能(使用闭合)并且比通过这些结合功能的处理程序:

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

update(bind(this, this.onSuccess), bind(this, this.onFail)); 
+0

THX,这解决了我的问题!我忘了提及,我不能在调用者类中做出任何更大的更改!所以我只传递'this-pointer'和目标类中的绑定内容。这工作得很好! – NATOR 2010-10-06 14:23:59

3

调用update()时,您有两种选择:

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

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

你的代码应该是这个样子:

this.get('target').update.call(this, this.onSuccess, this.onFail); 
1

要重定向这一点,你需要在Functionbind()(或类似)方法,如发现几乎所有的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