JavaScript闭包 - 有手动重置内部变量的替代方法吗?

时间:2015-12-27 23:43:42

标签: javascript closures

JavaScript闭包 - 有没有其他方法可以手动重置内部变量?

假设我们有以下关闭:

var SearchItemModalModel = (function(){
    var filter1;
    var filter2;
    var filter3;
    [...]
    var filterN;

    var initVariables = function(){
        filter1 = undefined;
        filter2 = undefined;
        filter3 = undefined;
        [...]
        filterN = undefined;
    };

    return {
        Init: function(){
            initVariables();
        },

        SomeFunction1 : function(){

        },

        SomeFunction2 : function(){

        }
        [...]
    }
})();

以上内容用于显示带有可过滤项目列表的模式。每次用户点击“显示可用商品”时,所有过滤器都应设置为未定义。用户可以根据需要多次显示模态,无需重新加载页面。

现在,我通过在 Init函数中调用 initVariables()来手动重置所有内容 - 但是每次修改上面的JS“class”时,我必须手动将所有新变量添加到 initVariables()函数...

所以问题是:还有更好的方法吗 - 这样就不需要手动重置了吗?起初我觉得这样的事情会起作用:

var searchItemModalModel = new SearchItemModalModel;

但是现在,在阅读了关于JS闭包的内容之后,我认为这不可能 - 或者是它?

2 个答案:

答案 0 :(得分:2)

在我看来,你正试图重新实现对象 您的示例适合构造函数模式:

var SearchItemModal = function(){
    var filter1;
    var filter2;
    var filter3;
    [...]
    var filterN;

    var initVariables = function(){
        filter1 = undefined;
        filter2 = undefined;
        filter3 = undefined;
        [...]
        filterN = undefined;
    };

    this.Init: function(){
         initVariables();
    };

    this.SomeFunction1 : function(){

    };

    this.SomeFunction2 : function(){

    };
    [...]
};

然后使用new创建新实例来使用它:

var searchItemModal = new SearchItemModal();
searchItemModal.Init();

我鼓励您在JavaScript here中阅读有关构造函数和OOP的更多信息,闭包很棒但是存在对象的原因,以及编写代码的方式,filterN变量将保持私有状态方式。

答案 1 :(得分:1)

您可以使用数组而不是变量:

var N = 5;
var filter;

var initVariables = function(){
    filter = new Array(N);
};
// access variables by it's index (starting from 0)
// e.g.: filter[0]

编辑:您还可以将所有变量保存在一个state对象中,并使用以下默认状态对其进行初始化:

var defaultState = {
    filter1: undefined,
    filter2: undefined,
    filter3: undefined,
    [...]
    filterN: undefined
};
var SearchItemModalModel = (function(){
    var state = defaultState;
    var initVariables = function(){
        state = defaultState;
    };

    [...]
    // access variable by object key
    // e.g.: state.filter1