Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript闭包-除了手动重置内部变量,还有其他选择吗?_Javascript_Closures - Fatal编程技术网

JavaScript闭包-除了手动重置内部变量,还有其他选择吗?

JavaScript闭包-除了手动重置内部变量,还有其他选择吗?,javascript,closures,Javascript,Closures,JavaScript闭包-除了手动重置内部变量,还有其他选择吗 假设我们有以下关闭: var SearchItemModalModel = (function(){ var filter1; var filter2; var filter3; [...] var filterN; var initVariables = function(){ filter1 = undefined; filter2 = undef

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“类”进行修改时,我都必须手动将所有新变量添加到initVariables()函数中

所以问题是:有没有更好的方法来实现这一点-这样就不需要手动重置?起初我认为这样做会奏效:

var searchItemModalModel = new SearchItemModalModel;

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

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

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]
编辑:您还可以将所有变量保存在一个
状态
对象中,并使用以下默认状态对其进行初始化:

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

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

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中构造函数和OOP的内容,闭包很好,但对象存在是有原因的,而且您编写代码的方式,
filterN
变量将保持私有。

感谢您的回答-不幸的是,在一些简单的模型中,我实际上就是这样做的,这在更复杂的视图中变得不切实际,我混合了多个过滤器字段、一些json数据、一些业务逻辑数据等等(我发布的示例来自“不复杂”类别)。那里的大多数变量都有更复杂的命名,不容易通过索引循环-我想lleaff答案就是我要找的-但我需要做更多的研究。嗯,我实际上在我真正的js闭包中使用了“machina.js”状态机-在一些“InitState”中重置所有变量可能是个好主意-谢谢。遗憾的是,这仍然是容易出错的手工劳动:(但我想这就是JS闭包设计的工作方式。实际上,您不必将默认状态的所有变量都设置为未定义。您只需使用
defaultState={}
如果你试图访问属性,你将无法定义。我觉得自己像个十足的白痴……我实际上尝试了你发布的方法,但结果证明,我试图将其作为一个闭包……没有“new”操作符……我明天将对此进行更彻底的测试,但它似乎很有希望……谢谢:)在一些教程中,我读到闭包是创建JS“类”的首选方法,现在我知道它们不是。。。JS可能会让人非常困惑>JS可能会让人非常困惑这完全是真的,而且随着语言的每一次添加,它会变得越来越混乱,就像它们一样好。这就是为什么如果你真的想成为JS高手,我建议你通过阅读一本合适的书来学习它,而不是从互联网上随意挑选教程(例如:,)再次感谢-我其实在寻找一本好的JS书:)我会很乐意看看这两本书。