我试图让一个
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()函数中的一分钟就打破了.
解决方法
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可以返回一个以后可以使用的函数或者传递给其他函数.