Анонимные функции JavaScript выражения против жизни


Обнаружил некоторый код, который использует IIFEs в выражении, а не просто обычную функцию.

var custom_type = (function() {
    return $('#myDiv').attr('custom_type');
})();

Обычно я пишу это примерно так:

var custom_type = function() {
    return $('#myDiv').attr('custom_type');
};

В чем причина существования IIFE? Единственное, что я могу придумать, это то, что IIFE может назначить переменную custom_type только один раз в начале, тогда как второй может продолжать проверять обновленный тип каждый раз, когда на переменную ссылаются.

4 6

4 ответа:

В этом примере вы можете полностью отказаться от функции и просто сделать:

var custom_type = $('#myDiv').attr('custom_type');

Однако в целом вы можете использовать IIFE для более сложного вычисления назначений переменных "точно во времени" - я люблю использовать их, если мне нужно что-то повторить, поэтому я могу иметь i, не загрязняя текущую область.

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

Первый из ваших (IIFE) выполняет функцию и сохраняет ее результат, второй сохраняет функцию как определение.

(function(x) {
    return x * 2;
})(5);

Вы выполняете вызов, подобный обычному funciton: func(arg1, arg2), но вместо имени функции вы передаете целое определение функции, поэтому выше будет возвращено 10 например:

function multiply(x) {
    return x * 2;
}

multiply(5);
Они означают одно и то же: вы делаете звонки. Маловероятно первое, второе-это определение плюс вызов.

IIFE фактически запустится (немедленно вызываемое выражение функции), поэтому переменная будет установлена в ее ответ.

Вот JSFiddle, чтобы продемонстрировать это, смотрите вашу консоль JS для вывода: http://jsfiddle.net/Y4JmT/1/

Код Здесь:

var custom_type = (function() {
    return 'foo';
})();

var custom_type2 = function() {
    return 'bar';
};

console.log('iife = ' + custom_type);
console.log('non-iife = ' + custom_type2);

В консоли JS вы увидите что-то похожее на:

iife = foo 

И

non-iife = function () {
    return 'bar';
} 

IIFEs позволяют вызывать функцию (анонимную или иную) в момент создания. Вы смотрели на это? http://benalman.com/news/2010/11/immediately-invoked-function-expression/