JQuery延迟更改"this"

Chr*_*ris 11 javascript jquery jquery-deferred

我试图让一个javascript对象运行一个延迟方法,当它的.done()调用同一个对象中的一个函数时.我有问题,因为"this"成为延迟对象而不是调用它的对象.

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");
Run Code Online (Sandbox Code Playgroud)

如何将"this"发送到successFunction?这个PageObject也将被其他人扩展,因此在运行successFunction时知道"this"将非常方便.

这似乎很简单,可能有一个简单的答案.我正在研究.apply(),但我不确定它是否有帮助.关于堆栈溢出的这篇文章有点帮助,但是它把它放入.done()函数的那一刻就打破了.

函数作为参数(带参数) - JavaScript

Den*_*nis 14

jQuery proxy将返回绑定到特定上下文的函数:

PageObject.prototype.loadPage = function(url) {
  return $.when($.mobile.loadPage("pages/" + url))
    .done($.proxy(this.successFunction, this));
};
Run Code Online (Sandbox Code Playgroud)

还有ES5的bind操作类似,但需要在旧浏览器中填充

PageObject.prototype.loadPage = function(url) {
  return $.when($.mobile.loadPage("pages/" + url))
    .done(this.successFunction.bind(this));
};
Run Code Online (Sandbox Code Playgroud)

apply并且call可以与指定的上下文立即执行的功能,但proxybind返回可用于以后或传递给其他功能的功能.