Полагаю, вы не совсем поняли, как работают замыкания.
Закрытия означают, что области действия всегда имеют доступ к внешней области видимости, которой они были определены дюйм.
function Counter(start) {
var count = start;
return {
increment: function() { // has access to the outer scope
count++;
},
get: function() {
return count;
}
}
}
var foo = new Counter(4);
foo.increment();
foo.get(); // 5
Приведенный выше пример возвращает два замыкания , и функция increment
, и get
сохраняют ссылку на переменную count
, определенную в конструкторе.
Один не может получить доступ к count
извне, единственный способ взаимодействия с ним - через две «закрытые» функции.
Помните, что замыкания работают, сохраняя ссылку на их внешние области, поэтому следующее не работает:
var foo = new Counter(4);
foo.hack = function() { // is not getting defined in the same scope that the original count was
count = 1337;
};
Это не изменит переменную count
, которая находится внутри Counter
, поскольку foo.hack
был не определен в этой области, вместо этого он создаст или переопределит глобальную переменная count
.