jQuery.proxy()在这种情况下如何工作?

时间:2014-04-24 01:39:54

标签: jquery proxy

我尝试了解following code。确切地说,研究方法是$ .proxy()。在我得到这个剧本之前,一切都很清楚:

(function($, exports){
    var mod = function(){};
    mod.fn  = mod.prototype;

    mod.fn.proxy = function(func){
        return $.proxy(func, this);
    };
    mod.fn.load = function(func){
        $(this.proxy(func));
    };
    exports.Controller = mod;
})(jQuery, window);

(function($, Controller){
    var mod = new Controller;
    mod.toggleClass = function(e){ 
        this.view.toggleClass("over", e.data);
    };
    mod.load(function(){
        this.view = $("#view");
        this.view.mouseover(this.proxy(this.toggleClass));
        this.view.mouseout(this.proxy(this.toggleClass));
    });
})(jQuery, Controller);

我不明白$ .proxy()在这部分是如何工作的:

mod.fn.load = function(func){
    $(this.proxy(func)); // Why it is converted into an object jQuery?
};

任何人都可以解释一下这是如何运作的吗?

1 个答案:

答案 0 :(得分:0)

它不是一个jQuery对象,$(this.proxy(func));正在将传递给load方法的函数注册为dom ready handler,这样即使在dom准备好之前调用load方法,回调函数也是推迟到dom准备好了。如果dom已经处于就绪状态,那么将立即执行回调。

mod.fn.load = function (func) {
    console.log('inside load')
    $(this.proxy(func));
    console.log('exit load')
};

演示:Fiddle

相同
mod.fn.load = function (func) {
    var self =  this;
    //dom ready callback
    $(function(){
        func.call(self);
    });
};

演示:Fiddle


如果您没有这样做,则脚本可能会失败,如

mod.fn.load = function (func) {
    var self =  this;
    console.log('inside load');
    func.call(self);
    console.log('exit load')
};

演示:Fiddle