Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.02.2014, 23:19
Аватар для Zuenf
Кандидат Javascript-наук
Отправить личное сообщение для Zuenf Посмотреть профиль Найти все сообщения от Zuenf
 
Регистрация: 27.01.2012
Сообщений: 134

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

Так вот:
Что в моих рассуждениях не правильно?
Если все верно, то смысл использовать такую конструкцию?
И я был бы очень рад, если вы приведете мне еще примеры конструктора функций, возможно даже более конкретные, чтобы я мог лучше понять когда и где стоит их использовать.
Ответить с цитированием
  #2 (permalink)  
Старый 05.02.2014, 19:12
Аспирант
Отправить личное сообщение для jsgeek Посмотреть профиль Найти все сообщения от jsgeek
 
Регистрация: 13.02.2013
Сообщений: 34

Флэнаган хорошо описал принцип работы замыканий.
Из примеров использования? Инкапсуляция.
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 инкапсулировать лучше с помощью атрибутов свойств.
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение ответа сервера через iframe и xhr. Помогите разобраться. Arconas AJAX и COMET 0 26.02.2013 10:38
Помогите разобраться с XML antonilyin Общие вопросы Javascript 2 14.11.2012 20:12
Помогите разобраться: false, null?? eirnvn Общие вопросы Javascript 12 12.11.2012 22:22
Помогите пожалуйста разобраться Kupu4 Ваши сайты и скрипты 0 21.01.2010 10:44
Помогите разобраться с галереей IMAGIN yana_studio Общие вопросы Javascript 4 12.12.2009 17:24