Анонимные функции 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 ответа:
В этом примере вы можете полностью отказаться от функции и просто сделать:
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/