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

如何在javascript中不重新定义变量,javascript,jquery,Javascript,Jquery,每次调用Client2.config.select2()时,所有内容都被重新定义 有没有办法防止重新定义这样的函数/对象?也就是说,如果我想让另一个变量保存此对象中的某些元素,运行Client2.config.select2()将覆盖它 有没有一种众所周知的模式可以做到这一点 Client2.config.select2 = function() { var coreIDs = ['clientID', 'cptyID' , 'sym']; var nonCoreID

每次调用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);
        }
    }
};

您应该使用模块模式:

这方面的一个例子是:

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

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

您是否尝试过关键字?

您可以使用闭包来完成此操作

本质上,您将把
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)中,我们将在immediate函数的范围内定义所有要定义的变量一次,一次。同样,使用闭包,您将能够在下面的返回函数中访问这些变量

在(3)中,我们让immediate函数返回一个函数,它返回您想要返回的对象。当您访问时,比如说,
getAutoCompleteSelectSettings
,您将从immediate函数内部返回
autoCompleteSettings

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


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

你所说的“一切”是什么意思?函数中声明的“coreIDs”之类的变量?如果不想重新初始化它们,只需将声明移到函数外部即可。可能会为正确的方向提供一些指导这对于单独解决OPs问题来说太过分了,虽然如果有很多JS被使用,这是一个好主意,但AI会认为这并不过分,因为它提供了阻止事情被重新定义的能力,并增加了更大的封装和对模块成员的受限访问。实现这种模式非常简单,只需要kkudi再添加几行代码即可。我所要做的就是让函数自调用,然后我就可以引用Client2.config.select2了。这样可以保持我想要的状态。感谢您的快速回复,我同意@Bojangles。您所需要的只是使用闭包来定义您想要在封装函数中定义的变量,这比这更容易实现(请参阅我的答案)。这听起来像是您所做的。这看起来像是一个范围问题,与只读变量无关。
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);
        }
    }
}