Помогите разобраться с замыканиями?
Решил углубиться в замыкания, прочитал статьи, увидел один из примеров использования и теперь есть вопросы.
Приведенный пример был следующий: // Создает одну функцию, которая печатает квадрат // указанного числа. 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:27. |