Из Википедии, свободной энциклопедии
Перейти к навигации Перейти к поиску

Немедленно вызывается функция выражение (или IIFE , объявленное «ненадежными», МП /ɪf.i/) [1] является JavaScript , язык программирования идиомы , который производит лексическую область с использованием в JavaScript функции области видимости .

Сразу вызываемые функциональные выражения могут использоваться для предотвращения подъема переменных из блоков, защиты от загрязнения глобальной среды и одновременного предоставления общего доступа к методам, сохраняя конфиденциальность для переменных, определенных в функции.

Использование [ править ]

Сразу вызываемые функциональные выражения могут быть записаны разными способами. [2] общее соглашение , чтобы заключить функцию выражение - и , возможно , его оператор вызова - с группировкой оператора, [3] в скобках, чтобы сообщить синтаксический анализатор явно ожидать выражение. В противном случае в большинстве ситуаций, когда синтаксический анализатор встречает functionключевое слово, он обрабатывает его как объявление функции (оператор), а не как выражение функции. [4] [5]

( функция  ()  {  / * ... * /  }) (); ( функция  ()  {  / * ... * /  } ()); (()  =>  {  / * ... * /  }) ();  // Со стрелочными функциями ES6 (хотя круглые скобки разрешены только снаружи)

Есть и другие способы принудительного выполнения выражения функции:

! function  ()  {  / * ... * /  } (); ~ function  ()  {  / * ... * /  } (); - function  ()  {  / * ... * /  } (); + function  ()  {  / * ... * /  } (); void  function  ()  {  / * ... * /  } ();

В контекстах, где ожидается выражение, заключать в круглые скобки необязательно:

var  f  =  function  ()  {  / * ... * /  } (); истина  &&  function  ()  {  / * ... * /  } (); 0 ,  function  ()  {  / * ... * /  } ();

Передача переменных в область видимости выполняется следующим образом:

( function ( a ,  b )  {  / * ... * /  }) ( "привет" ,  "мир" );

Начальные скобки - это тот случай, когда автоматическая вставка точки с запятой (ASI) в JavaScript может вызвать проблемы; выражение вместо этого интерпретируется как вызов последнего термина в предыдущей строке. В некоторых стилях, в которых опускаются необязательные точки с запятой, точка с запятой ставится перед круглыми скобками и называется защитной точкой с запятой . [6] [7] Например:

a  =  b  +  c ; ( function  ()  {  // код }) ();

... чтобы избежать синтаксического анализа как c().

Примеры [ править ]

Ключом к пониманию шаблонов проектирования, таких как IIFE, является осознание того, что до ES6 в JavaScript была только область функций (таким образом, не было области блока ), а значения передавались по ссылке внутри замыканий . [8] Это уже не так, поскольку версия JavaScript для ES6 реализует определение области видимости блока с помощью ключевых слов new letи const. [9]

Контекст оценки [ править ]

Отсутствие области видимости блока означает, что переменные, определенные внутри (например) цикла for, будут иметь свое определение «поднятым» в верхнюю часть включающей функции. Оценка функции, которая зависит от переменных, измененных внешней функцией (в том числе путем итерации), может быть трудной. Мы можем увидеть это без цикла, если обновим значение между определением и вызовом функции. [10]

var  v ,  getValue ; v  =  1 ; getValue  =  function  ()  {  return  v ;  }; v  =  2 ;getValue ();  // 2

Хотя результат может показаться очевидным при обновлении vвручную, он может привести к непредвиденным результатам, если getValue()он определен внутри цикла.

В дальнейшем функция передается vв качестве аргумента и вызывается немедленно, сохраняя контекст выполнения внутренней функции. [11]

var  v ,  getValue ; v  =  1 ; getValue  =  ( функция  ( x )  {  функция возврата  () { возврат x ; }; }) ( v ); v = 2 ;       getValue ();  // 1

Это эквивалентно следующему коду:

var  v ,  getValue ; v  =  1 ; функция  f ( x )  {  return  function  ()  {  return  x ;  }; }; getValue  =  f ( v ); v  =  2 ;getValue ();  // 1

Эффективный JavaScript Дэвида Хермана содержит пример, иллюстрирующий проблемы контекста оценки внутри циклов. [12] Хотя пример Германа намеренно запутан, он напрямую связан с тем же недостатком области видимости блока. [13]

Создание частных переменных и средств доступа [ править ]

IIFE также полезны для создания частных методов для доступных функций, в то же время предоставляя некоторые свойства для последующего использования. [14] Следующий пример взят из сообщения Алмана о IIFE. [1]

// «счетчик» - это функция, которая возвращает объект со свойствами, которые в данном случае являются функциями. var  counter  =  ( function  ()  {  var  i  =  0 ; return  {  получить :  функция  ()  {  вернуть  я ;  },  установите :  function  ( val )  {  i  =  val ;  },  приращение :  функция  ()  {  return  ++ i ;  }  }; }) ();// Эти вызовы обращаются к свойствам функции, возвращаемым "counter". счетчик . получить ();  // 0 счетчик . набор ( 3 ); счетчик . инкремент ();  // 4 счетчика . инкремент ();  // 5

Если мы попытаемся получить доступ counter.iиз глобальной среды, он будет неопределенным, поскольку он заключен в вызываемую функцию и не является свойством counter. Точно так же, если мы попытаемся получить доступ i, это приведет к ошибке, поскольку мы не объявили iв глобальной среде.

Терминология [ править ]

Первоначально известный как «самоисполняющаяся анонимная функция» [15], Бен Альман позже ввел текущий термин IIFE как более семантически точное название идиомы, вскоре после того, как его обсуждение возникло на comp.lang.javascript. [1] [16] [17]

Примечательно, что сразу же вызываются функции не должны быть анонимными по своей сути, и ECMAScript  строгий режим запрещает 5'в arguments.callee, [18] делает первоначальный срок в некорректным .

См. Также [ править ]

  • Стратегия редукции в лямбда-исчислении

Ссылки [ править ]

  1. ^ a b c Алман, Бен (15 ноября 2010 г.). «Немедленно вызываемые функциональные выражения» . Архивировано 1 декабря 2017 года . Проверено 18 января 2019 .
  2. ^ Линдли, Коди (2013). Просвещение JavaScript . О'Рейли. п. 61. ISBN 978-1-4493-4288-3.
  3. ^ "Оператор группировки" . Сеть разработчиков Mozilla.
  4. ^ Zakas, Николай (2012). Поддерживаемый JavaScript . О'Рейли. п. 44. ISBN 978-1-4493-2768-2.
  5. ^ Аксель Раушмайер. «Изучение JS» .
  6. ^ «Вставка точки с запятой в JavaScript: все, что вам нужно знать» . 28 мая 2010. Архивировано 2 октября 2017 года.
  7. ^ Marohnić, Mislav (7 мая 2010). «Точка с запятой в JavaScript не обязательна» . Архивировано 8 августа 2017 года.
  8. ^ Haverbeke, Marijn (2011). Красноречивый JavaScript . Пресс без крахмала. С. 29–30. ISBN 978-1-59327-282-1.
  9. ^ ECMAScript 6: Новые возможности: обзор и сравнение, переменные с блочной областью видимости
  10. ^ Альман, Бен. "простой-iife-example.js" . Github . Проверено 5 февраля 2013 года .
  11. ^ Отеро, Сезар; Ларсен, Роб (2012). Профессиональный jQuery . Джон Вили и сыновья. п. 31. ISBN 978-1-118-22211-9.
  12. ^ Герман, Дэвид (2012). Эффективный Javascript . Эддисон-Уэсли. С. 44–45. ISBN 978-0-321-81218-6.
  13. ^ Zakas, Nicholas C. (2011). «Подражание блоку». Профессиональный JavaScript для веб-разработчиков . Джон Вили и сыновья. ISBN 978-1-118-23309-2.
  14. ^ Реттиг, Паскаль (2012). Профессиональная разработка мобильных игр на HTML5 . Джон Вили и сыновья. п. 145. ISBN 978-1-118-30133-3.
  15. ^ Resig, Джон (2006). Профессиональные техники JavaScript . Апресс. п. 29. ISBN 978-1-4302-0283-7.
  16. ^ Osmani, Addy (2012). Изучение шаблонов проектирования JavaScript . О'Рейли. п. 206. ISBN. 978-1-4493-3487-1.
  17. ^ Baagoe, Johannes. «Закрывающая скобка в определении функции с последующим ее вызовом» . Проверено 19 апреля 2010 года .
  18. ^ «Строгий режим» . Справочник по Mozilla JavaScript . Сеть разработчиков Mozilla . Проверено 4 февраля 2013 года .

Внешние ссылки [ править ]

  • «Функции и объем функций» . Справочник по Mozilla JavaScript . Сеть разработчиков Mozilla . Проверено 4 февраля 2013 года .