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闭包的内容之后,我认为这不可能 - 或者是它?
答案 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