1

抱歉,主题标题不太好。不知道如何命名。

我需要这个例子的帮助,我完全迷路了。

因此,当函数 fillView 调用它时一切都很好,但是第二次调用它时重新调整大小它就不起作用了,因为在渲染函数中“this”定义了一个窗口,而不是 localClass 的实例。我需要解释如何解决这个问题。请写一个例子。

(function ($) { 
var localClass = function(options) {
    this.a = 123;
};

localClass.prototype.render = function() {
    console.log(this.a);
}

$.fn.fillView = function(options){
    var view = new localClass(options);
    view.render(); //this prints to console 123

    $(window).resize(view.render); //this doesn't print 123 
                                     because 'this' is now - Window

    }
})(jQuery)
4

1 回答 1

3

代替

$(window).resize(view.render);

$(window).resize(function(){view.render()});

如果您只针对新浏览器(即您不需要与 IE8 兼容),您也可以使用bind

$(window).resize(view.render.bind(view));

这个怎么运作 :

1)当您传递一个函数时,您只需将另一个属性的值设置为该函数。这就像做

var f = view.render.

当这个函数被调用时,它会像这样被调用:

f(); 

那么可能更清楚的是this,在函数中,没有理由成为view。实际上,它会在这里window。更准确地说,this在函数中, 不是函数的初始“所有者”,而是接收者,这取决于您如何调用该函数。

事实上,它可能是另一个对象:如果你执行

f.call(someObject)

然后thisin f(which is render) 将是someObject.

2)但是当你传递一个函数时

var f = function(){ view.render() }

那么你如何调用并不重要,f因为render它是view作为接收者调用的。

3)还有其他解决方案:bind或者$.proxy两者都构建一个嵌入您的新功能,但确保this始终是您传递的对象。

于 2013-07-08T19:31:17.343 回答