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

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

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

обычно я бы написал это как-то вроде:

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

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

4 ответов


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

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

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

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


первый из ваших (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/