我试图让一个
JavaScript对象运行一个延迟的方法,当它是.done()调用同一个对象的一个函数.我有问题,因为“这”成为延迟对象,而不是调用它的对象.
PageObject.prototype.successFunction = function() {
console.log(arguments);
return console.log(this.name + " Success function called");
};
PageObject.prototype.loadPage = function(url) {
return $.when($.mobile.loadPage("pages/" + url))
.done(this.successFunction);
};
var pg = new PageObject();
pg.loadPage("test.html");
如何将“this”发送到successFunction?这个PageObject也会被其他人扩展,所以在运行successFunction时知道“this”将会非常方便.
看起来很简单,可能有一个简单的答案.我正在研究.apply(),但我不确定它是否有帮助.这个堆栈溢出的帖子有一点帮助,但是我把它放在.done()函数中的一分钟就打破了.
Functions as parameters (with parameters) — JavaScript
解决方法
jQuery的
proxy将返回一个绑定到特定上下文的函数:
PageObject.prototype.loadPage = function(url) {
return $.when($.mobile.loadPage("pages/" + url))
.done($.proxy(this.successFunction,this));
};
还有ES5的bind,其操作方式类似,但需要在旧版浏览器中进行闪烁
PageObject.prototype.loadPage = function(url) {
return $.when($.mobile.loadPage("pages/" + url))
.done(this.successFunction.bind(this));
};
apply和call可以使用指定的上下文立即执行一个函数,但是proxy和bind可以返回一个以后可以使用的函数或者传递给其他函数.