Показать сообщение отдельно
  #24 (permalink)  
Старый 27.10.2008, 00:07
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

EugenyK, все просто:

var f = function () {
  if (известныеДанные) {
    alert(1);
  } else {
    alert(2);
  }
};


При вызове данной функции f() всегда будет выполняться if (это очевидно).

Далее, известно, что функцию можно вызвать сразу после объявления:

(function a () { // объявляем функцию
  alert(3);
})(); // и тут же ее вызваем


Кстати, имя функции в данном случае опционально.

В JavaScript функция является объектом, ее можно вернуть, присвоить и т.д. - см. первый пример - переменной f присваивается анонимная функция, которая потом доступна для вызова через имя переменной - f(). Т.е. первый пример можно "перефразировать" так (мы делаем внешнюю оболочку из анонимной функции, которая вызывается сразу же после своего определения и возвращает другую анонимную функцию):

var f = (function () {
  return function () {
    if (известныеДанные) {
      alert(1);
    } else {
      alert(2);
    }
  }
})();


Таким образов вызов нынешней функции f() ничем не отличается от первой. Но, естественно, никакого смысла в такой перефразировке нет - мы только лишь создали дополнительное действием по вызову внешней анонимной функции. Однако, (сейчас пойдет ответ на твой вопрос ): если мы вынесем if-else в определение внешней оболочки (при условии, что данные для проверки известны заранее и неизменны), то проверка выполнится единожды - когда функция-оболочка вызовется сразу же после определения. В проверках же нужно вернуть функции уже без проверок, - просто выполняющих свои действия:

var f = (function () {
  if (известныеДанные) {
    return function () {
      alert(1);
    };
  } else {
    return function () {
      alert(2);
    };
  }
})();


Теперь f - это либо function () {alert(1)}; либо function () {alert(2)};, и определилось это при инициализации - один раз. Сам вызов f() уже никаких проверок не делает.
__________________
Тонкости ECMAScript
Ответить с цитированием