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() уже никаких проверок не делает.