如何在javascript中不重新定义变量

时间:2013-09-25 12:29:20

标签: javascript jquery

每次调用Client2.config.select2()时,一切都会被重新定义。

有没有办法阻止重新定义这样的函数/对象?即如果我想要另一个在该对象中保存一些元素的变量,运行Client2.config.select2()会覆盖它。

有一个众所周知的模式吗?

Client2.config.select2 = function() {

    var coreIDs    =  ['clientID', 'cptyID' , 'sym'];

    var nonCoreIDs =  ['groupBy','groupBy_impact_1','groupBy_impact_2',
        'groupBy_impact_3','groupBy_impact_4'];

    //non dynamic filters 
    var autoCompleteSettings =  function () {
        return {
            allowClear : true,
            minimumInputLength : 2,
            multiple : true,
            placeholder: "Select ",
            closeOnSelect : false,
            openOnEnter : true,
            ajax: {
                url : "../my?page=search",
                dataType : 'json',
                data : function(term, page) {
                    return {
                        q : term
                    };
                },
                results : function(data, page) {
                    return {
                        results : data
                    };
                }
            }
        };
    };

    var multipleSettings = function () {
        return {
            placeholder : "Select ",
            allowClear : true,
            closeOnSelect : false,
            maximumSelectionSize: 6
        };
    };

    return {
        getAutoCompleteSelectSettings: function() {
            return new autoCompleteSettings();
        },
        getMultipleSelectSettings: function() {
            return new multipleSettings();
        },
        getCoreSelect2IDs: function () {
            return coreIDs;
        },
        getNonCoreSelect2IDs: function () {
            return nonCoreIDs;
        },
        getSelect2IDs : function() {
            return coreIDs.concat(nonCoreIDs);
        }
    }
};

3 个答案:

答案 0 :(得分:3)

您应该使用模块模式:http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html

这方面的一个例子是:

(function (CkSpace, $, undefined) {
    CkSpace.GetLoanValues = function () { //public member
       //Do Stuff
    }
    var myNumber = 1; //private member

} (window.CkSpace = window.CkSpace || {}, jQuery));

答案 1 :(得分:2)

你可以使用闭包来做到这一点。

基本上,你要设置Client2.config.select2等于立即函数,在立即函数内部定义变量(分配一次),并使用闭包来访问那些曾经定义过的变量。返回的功能。

Client2.config.select2 =  (function() {                              /* 1 */

    var coreIDs    =  ['clientID', 'cptyID' , 'sym'];                /* 2 */

    var nonCoreIDs =  ['groupBy','groupBy_impact_1','groupBy_impact_2',
        'groupBy_impact_3','groupBy_impact_4'];

    //non dynamic filters 
    var autoCompleteSettings =  function () {
        return {
            allowClear : true,
            minimumInputLength : 2,
            multiple : true,
            placeholder: "Select ",
            closeOnSelect : false,
            openOnEnter : true,
            ajax: {
                url : "../my?page=search",
                dataType : 'json',
                data : function(term, page) {
                    return {
                        q : term
                    };
                },
                results : function(data, page) {
                    return {
                        results : data
                    };
                }
            }
        };    
    };    

    var multipleSettings = function () {
        return {
            placeholder : "Select ",
            allowClear : true,
            closeOnSelect : false,
            maximumSelectionSize: 6
        };
    };

    return function (){                                              /* 3 */
        return {
            getAutoCompleteSelectSettings: function() {
                return new autoCompleteSettings();
            },
            getMultipleSelectSettings: function() {
                return new multipleSettings();
            },
            getCoreSelect2IDs: function () {
                return coreIDs;
            },
            getNonCoreSelect2IDs: function () {
                return nonCoreIDs;
            },
            getSelect2IDs : function() {
                return coreIDs.concat(nonCoreIDs);
            }
        }
    }
})();

在(1)中,你看到我们正在包装这样的函数:

(function(){ 
    /* ... */ 
})();

如果您不知道,这称为立即函数,因为它在到达时立即执行。这意味着此功能运行一次。

在(2)中,我们定义了你想要定义的所有变量,一次,在立即函数的范围内。再次,使用闭包,您将能够在下面返回的函数中访问这些变量。

在(3)中,我们使用立即函数返回一个函数,该函数返回您想要返回的对象。当您访问getAutoCompleteSelectSettings时,您将从立即函数内部返回autoCompleteSettings

基本上你可以这样想。在立即函数运行之后,我们已经定义了这样的赋值(因为这是立即函数返回的内容):

Client2.config.select2 = function (){
    return {
        getAutoCompleteSelectSettings: function() {
            return new autoCompleteSettings();
        },
        getMultipleSelectSettings: function() {
            return new multipleSettings();
        },
        getCoreSelect2IDs: function () {
            return coreIDs;
        },
        getNonCoreSelect2IDs: function () {
            return nonCoreIDs;
        },
        getSelect2IDs : function() {
            return coreIDs.concat(nonCoreIDs);
        }
    }
}

我们在这里访问的每个对象和变量都可以通过立即函数中的引用访问。

答案 2 :(得分:0)

你有没有试过const关键字?