所以我一直在研究javascript,现在我正在关注闭包 . 我以为我理解了所有的概念,但我显然错过了一些东西 . 出于学习目的,我创建了这个闭包,它基本上就像一个带有Object和整数成员的类 . 代码如下:
var AllFilters = (function () {
var _length = 0;
var _filters = {};
//Return new length.
//Overwrites if exists.
function _addFilter(filter) {
_filters[filter.name] = filter;
_length++; //test if it was actually incremented...
}
//Remove property from object.
//Returns the removed propety value, or undefinned.
function _removeFilter(filter) {
var removed;
if (filter.name !== undefined) {
//Removed based on filter object;
removed = _filters[filter.name];
delete _filters[filter.name];
} else {
//Removed based on filter name;
removed = _filters[filter];
delete _filters[filter];
}
_length--; //teste if it was actually deleted...
return removed;
}
//Param = filter name;
//Returns undefined or filter;
function _getFilter(filter) {
return _filters[filter];
}
//Return all filters in an array.
function _getAsArray() {
var arr = [];
for (var filter in _filters) {
if (_filters.hasOwnProperty(filter)) {
arr.push(_filters[filter]);
}
}
return arr;
}
return function () {
return {
addFilter: _addFilter,
removeFilter: _removeFilter,
getFilter: _getFilter,
getAsArray: _getAsArray,
length: _length
};
};
}());
使用:
x = AllFilters();
x.addFilter({ name: "a", foo: "bar" });
x.addFilter({ name: "b", foo: "baz" });
x.addFilter({ name: "c", foo: "qux" });
一切都很完美,除了长度:它总是返回零,我想让它返回当前值,就像静态var . _filters var正确返回,它并不总是像长度一样重置,所以我真的不知道这里发生了什么,我认为_length会像_filters一样保持它的状态 . 有什么想法吗?
1 回答
更新
_length
变量时,它不会更改x.length
属性 . 这是在创建对象时使用长度初始化的,但是您永远不会更新它 . 您需要使该属性成为一个从闭包变量返回长度的函数:然后你可以使用
x.length()
获取当前长度 .