我在使用JavaScript和传递函数作为另一个函数的参数时遇到了一些麻烦。
让我们说我们在课堂上并做同样的事情:
this.get('target').update(this.onSuccess, this.onFail);
在更新方法中发生了一些事情,当它完成时,该方法应该调用onSuccess方法或onFail方法。这看起来像是:
update: function(onSuccess, onFail) {
if(true) {
onSuccess();
} else {
onFail();
}
}
直到现在,一切都很好!但是在调用者类(在update-method之上调用的那个)中定义的那些成功/失败方法中,我正在使用这个指针:
onFail: function() {
alert('Error: ' + this.get('target').error);
}
这个指针会导致一些问题。它没有指向最初定义方法的类,而是指向'target'对象。
我现在需要做的是在onSuccess / onFail调用“target”类内部之前更新this-pointer,以使方法再次起作用。但由于“无效指派左侧”错误,这不起作用。
这样的场景的最佳做法是什么?有任何想法吗? thx提前!!!
欢呼声
答案 0 :(得分:3)
调用update()
时有两种选择:
call()
apply()
主要区别在于如何将参数传递给它。但它们都允许范围/上下文注入。
您的代码应如下所示:
this.get('target').update.call(this, this.onSuccess, this.onFail);
答案 1 :(得分:3)
您可以创建一个函数,将函数“绑定”到某个对象(使用闭包),然后将这些绑定函数传递给处理程序:
function bind(obj, fun) {
return function() {
return fun.apply(obj, arguments);
};
};
update(bind(this, this.onSuccess), bind(this, this.onFail));
答案 2 :(得分: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