60 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			60 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | |||
|  | title: Immediately Invoked Functions Expressions(IIFEs) | |||
|  | localeTitle: Выражения мгновенно выработанных функций (IIFE) | |||
|  | --- | |||
|  | ## Заявление о функции
 | |||
|  | 
 | |||
|  | Функция, созданная с объявлением функции, является объектом Function и имеет все свойства, методы и поведение объектов Function. Пример: | |||
|  | 
 | |||
|  | ```javascript | |||
|  |   function statement(item){  | |||
|  |     console.log('Function statement example '+ item);  | |||
|  |   }  | |||
|  | ``` | |||
|  | 
 | |||
|  | ## Выражение функции
 | |||
|  | 
 | |||
|  | Выражение функции аналогично выражению функции, за исключением того, что имя функции может быть опущено для создания анонимных функций. Пример: | |||
|  | 
 | |||
|  | ```javascript | |||
|  |   var expression = function (item){  | |||
|  |     console.log('Function expression example '+ item);  | |||
|  |   }  | |||
|  | ``` | |||
|  | 
 | |||
|  | ## Выражения мгновенно выработанных функций
 | |||
|  | 
 | |||
|  | В скором времени, когда функция создается, она вызывает сам вызов явно не требуется. В приведенном ниже примере переменная iife будет хранить строку, возвращаемую выполнением функции. | |||
|  | 
 | |||
|  | ```javascript | |||
|  |   var iife = function (){  | |||
|  |     return 'Immediately Invoked Function Expressions(IIFEs) example ';  | |||
|  |   }();  | |||
|  |   console.log(iife); // 'Immediately Invoked Function Expressions(IIFEs) example '  | |||
|  | ``` | |||
|  | 
 | |||
|  | Заявление перед IIFE должно всегда заканчиваться a; или он выдаст ошибку. | |||
|  | 
 | |||
|  | **Плохой пример** : | |||
|  | 
 | |||
|  | ```javascript | |||
|  | var x = 2 //no semicolon, will throw error  | |||
|  |  (function(y){  | |||
|  |   return x;  | |||
|  |  })(x); //Uncaught TypeError: 2 is not a function  | |||
|  | ``` | |||
|  | 
 | |||
|  | ## Зачем использовать выраженные выражения с выраженным выражением?
 | |||
|  | 
 | |||
|  | ```javascript | |||
|  |   (function(value){  | |||
|  |     var greet = 'Hello';  | |||
|  |     console.log(greet+ ' ' + value);  | |||
|  |   })('IIFEs');  | |||
|  | ``` | |||
|  | 
 | |||
|  | В приведенном выше примере, когда javascript engine выполняет над кодом, он создаст глобальный контекст выполнения, когда увидит код и создаст объект функции в памяти для IIFE. И когда он достигает строки `46` из-за которой вызывается функция, новый «контекст выполнения» создается «на лету», поэтому переменная приветствия переходит в контекст выполнения функции не в глобальную, и это делает ее уникальной. `This ensures that code inside IIFE does not interfere with other code or be interfered by another code` поэтому код безопасен. | |||
|  | 
 | |||
|  | #### Больше информации
 | |||
|  | 
 | |||
|  | [Немедленное выражение функции в Википедии](https://en.wikipedia.org/wiki/Immediately-invoked_function_expression) [Что делает ведущая точка с запятой в библиотеках JavaScript?](https://stackoverflow.com/questions/1873983/what-does-the-leading-semicolon-in-javascript-libraries-do) |