Jquery插件范围问题(闭包)

时间:2009-12-23 20:15:48

标签: jquery

我正在尝试制作插件并遇到一些问题:

(function($){
    var users = {};

    $.fn.plugin = function(){
        //blah, but alters users
    }
    $.fn.utility_function = function(){
        // uses users
    }
});

当我运行此插件的两个实例时,“用户”最终会为插件的每个实例提供相同的值。我如何使它们独一无二?

2 个答案:

答案 0 :(得分:2)

这是完全正常的,因为您的用户对象超出了插件的范围。

我建议你将值存储为附加到受插件影响的dom元素的data()jquery方法的一部分

请参阅this article

答案 1 :(得分:0)

如果您想要唯一的对象,可以使用jquery内置的extend方法对对象进行深层复制。

在你的情况下,你会这样做:

(function($){
    var users = {};

    $.fn.plugin = function(){
        var myUsers = $.extend({}, users);
        //blah, but alters users
        // BUT should now use myUsers instead
    }
    $.fn.utility_function = function(){
        // uses users
    }
});

但我不确定你是否想要用户对象的唯一副本,因为它们可能是一个可能只在全局发生变化的单一集合。