JavaScript闭包-除了手动重置内部变量,还有其他选择吗?
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
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书:)我会很乐意看看这两本书。