0

Не могу не испытывать отвращение к IIFE (Immediately Invoked Function Expression). Если не брать в расчет модули, можно ли отказаться от них в пользу анонимных блочных областей? В чем принципиальная разница между ними?

Пример IIFE:

var outsideTest = 'Меня видно';

var result = (function(){ var insideTest = 'Меня не видно'; console.log(outsideTest);

return insideTest + ', если только так...'; })();

console.log(result); console.log(insideTest);

Пример с блочной областью (ясно, что var здесь использовать не стоит):

let outsideTest = 'Меня видно';

let result;

{ let insideTest = 'Меня не видно'; var anotherInside = 'Видно:(' console.log(outsideTest);

result = insideTest + ', если только так...'; }

console.log(result); console.log(anotherInside); console.log(insideTest);

Leonid
  • 5,797
  • Ну а если блок большой, и не виден на одной странице? Особенно если виден только хвост } — не понятно, это условие закончилось, или цикл, или что еще... а при встрече })(); сразу понятно, о чем речь) – OPTIMUS PRIME Apr 17 '20 at 20:20
  • Ага, особенно если: (function(whichIsTheHour){})("MGIMO finished?"); :) Такое не пропустишь). By the way, я заметил, что обычную функцию объявить нельзя в блочной области, только стрелочную. Или не так? – Leonid Apr 17 '20 at 20:49
  • 1
    O_o можно... Заметил, что jsFiddle ругается на это. Но перестает, если записать блок с точкой-запятой впереди ;{ }. P.s. пример IIFE переписал бы так: let whichIsTheHour = "MGIMO finished?"; (function(){ /*пусть уж временную внешнюю переменную берет*/ })(); если нет вопросов с замыканием. А если есть - вероятно, обычная функция больше подходит. – OPTIMUS PRIME Apr 17 '20 at 21:11
  • Точно можно, но ; не помогает, ругается и ругается. А IIFE просто для хохмы, чтобы заметней стало начало и конец. Тело я пропустил, чтобы не загромождать комментарии). Так собственно объявление именованной функции в блочной области позволяет использовать эту функцию за пределами блока, а IIFE - нет. – Leonid Apr 17 '20 at 21:23
  • код в блоке нельзя рекурсивно вызвать – Grundy Apr 17 '20 at 21:35
  • А как можно эту бяку рекурсивно вызвать? Здесь result()? – Leonid Apr 17 '20 at 21:41
  • @Leonid, с блочной видимостью функции не все так просто – Grundy Apr 17 '20 at 21:41
  • @Leonid, IIFE не обязана быть анонимной функцией: (function a{ a(); })( ) – Grundy Apr 17 '20 at 21:42

0 Answers0