So I've been studying javascript and I'm looking at closures now. I thought I had understood all the concept but I'm obviously missing something. For just studying purposes I created this closure that basically behaves like a class with an Object and an integer member. The code is as follows:
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
};
};
}());
Using:
x = AllFilters();
x.addFilter({ name: "a", foo: "bar" });
x.addFilter({ name: "b", foo: "baz" });
x.addFilter({ name: "c", foo: "qux" });
Everything works perfectly, except the length: it always returns zero, I want to make it return the current value, like a static var. The _filters var is returned correctly, it is not always reset like the length, so I really have no idea what is going on here, I thought _length would keep its state just like _filters does. Any thoughts?