Я пытаюсь обдумать идею классов, видимости данных и замыканий (особенно в Javascript), и я на странице документов jQuery для типов, где упоминается, что замыкания используются для скрытия данных:
Шаблон позволяет создавать объекты с методами, которые работают с данными, которые не видны извне - сама основа объектно-ориентированного программирования.
Пример:
function create() {
var counter = 0;
return {
increment: function() {
counter++;
},
print: function() {
console.log(counter);
}
}
}
var c = create();
c.increment();
c.print(); // 1
Объявляя переменный counter ключевым словом var, он уже локально ограничен в определении функции / класса. Насколько я знаю и могу сказать, он не доступен снаружи с самого начала. Я что-то упускаю с точки зрения видимости данных.
Во-вторых, есть ли преимущество в написании класса как выше, так и ниже:
function create() {
var counter = 0;
this.increment = function() {
counter++;
}
this.print = function() {
console.log(counter);
}
return this;
}
var c = create();
c.increment();
c.print(); // 1
Насколько я понимаю, это более или менее семантически одно и то же - первое - просто более "стиль jQuery". Мне просто интересно, есть ли преимущество или другой нюанс, который я не полностью оцениваю из первого примера. Если я прав, оба примера создают замыкания в том, что они обращаются к данным, объявленным вне их собственной области действия.
http://docs.jquery.com/Types#Closures