Помогите разобраться с замыканиями?
Решил углубиться в замыкания, прочитал статьи, увидел один из примеров использования и теперь есть вопросы.
Приведенный пример был следующий:
// Создает одну функцию, которая печатает квадрат
// указанного числа.
function createFunc(n) {
return function() { alert(n*n) };
}
// Создает number таких функций и возвращает их массив.
function create(number) {
var arr = [];
for (var i=1; i<number; i++) {
arr[i] = createFunc(i);
}
return arr;
}
// Теперь создаем все функции...
var arr = create(100);
// ...и запускаем четвертую по счету.
arr[4]();
Мои рассуждения(не обязательно правильные): Функция createFunc создает [[scope]] со свойством n, а функция которую он возвращает получает ссылку на него. То есть в итоге создается 100 объектов [[scope]], под каждый из которых выделена память. Вроде ничего не должно кэшироваться т.к. в итоге каждая созданная функция будет иметь выражение типа alert([[scope]].n*[[scope]].n) и вычислять их каждый раз при обращении к возвращенной функции. Я понимаю, что это пример, но даже если бы там находились сверх сложные расчеты, то это никак не повлияло бы на производительность. Так вот: Что в моих рассуждениях не правильно? Если все верно, то смысл использовать такую конструкцию? И я был бы очень рад, если вы приведете мне еще примеры конструктора функций, возможно даже более конкретные, чтобы я мог лучше понять когда и где стоит их использовать. |
Флэнаган хорошо описал принцип работы замыканий.
Из примеров использования? Инкапсуляция.
function user(name, password, karma) {
return {
getName: function() {return name;},
setName: function(s) {return name = s;},
checkPassword: function(pwd) {return pwd === password},
getKarma: function() {return karma;},
upKarma: function(n) {return karma += n;},
downKarma: function(n) {return karma -= n;}
};
}
var usr1 = user("Вася", "pass", 1);
usr1.getName(); // => "Вася"
usr1.setName("Петя");
usr1.getName(); // => "Петя"
usr1.checkPassword("123"); // => false
usr1.checkPassword("pass"); // => true
// ...
PS. это только пример. в ES5 инкапсулировать лучше с помощью атрибутов свойств. |
| Часовой пояс GMT +3, время: 04:19. |