<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://support.qbpro.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9E%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9_%D0%B2_JavaScript</id>
	<title>Особенности функций в JavaScript - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://support.qbpro.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9E%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9_%D0%B2_JavaScript"/>
	<link rel="alternate" type="text/html" href="https://support.qbpro.ru/index.php?title=%D0%9E%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9_%D0%B2_JavaScript&amp;action=history"/>
	<updated>2026-04-03T18:41:03Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.38.1</generator>
	<entry>
		<id>https://support.qbpro.ru/index.php?title=%D0%9E%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9_%D0%B2_JavaScript&amp;diff=225&amp;oldid=prev</id>
		<title>imported&gt;Supportadmin: Новая страница: «оригинал: http://learn.javascript.ru/function-declaration-expression ----- В этом разделе мы познакомимся c важными ос…»</title>
		<link rel="alternate" type="text/html" href="https://support.qbpro.ru/index.php?title=%D0%9E%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9_%D0%B2_JavaScript&amp;diff=225&amp;oldid=prev"/>
		<updated>2013-08-04T09:55:14Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «оригинал: http://learn.javascript.ru/function-declaration-expression ----- В этом разделе мы познакомимся c важными ос…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;оригинал: http://learn.javascript.ru/function-declaration-expression&lt;br /&gt;
-----&lt;br /&gt;
В этом разделе мы познакомимся c важными особенностями функций в JavaScript, а также с тремя способами объявить функцию.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Функция — это значение ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В JavaScript функция является значением, таким же как строка или число.&lt;br /&gt;
&lt;br /&gt;
Объявление создает функцию и присваивает в переменную.&lt;br /&gt;
&lt;br /&gt;
Как и любое значение, функцию можно вывести, вот так:&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
 function sayHi() {&lt;br /&gt;
  alert('Привет');&lt;br /&gt;
 }&lt;br /&gt;
 alert(sayHi); // выведет код функции&lt;br /&gt;
&lt;br /&gt;
Здесь выводится не результат работы функции sayHi() (кстати, чему он равен?.. правильно, undefined, т.к. нет return), а сама функция, т.е. ее код.&lt;br /&gt;
&lt;br /&gt;
'''Функцию можно скопировать.''' После копирования ее можно вызывать:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 function sayHi(person) {&lt;br /&gt;
  alert('Привет, ' + person);&lt;br /&gt;
 }&lt;br /&gt;
 var func = sayHi;&lt;br /&gt;
 func('Вася'); // выведет 'Привет, Вася'&lt;br /&gt;
 sayHi('Маша'); // и так по-прежнему работает&lt;br /&gt;
&lt;br /&gt;
Копируется, конечно, не сама функция, а ссылка на неё. Получается, что обе переменные sayHi и func как бы указывают на одно и то же «место в памяти», где находится функция.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Объявление Function Declaration ==&lt;br /&gt;
&lt;br /&gt;
Объявление функции, о котором мы говорили все время до этого, называется в спецификации языка Function Declaration.&lt;br /&gt;
&lt;br /&gt;
Устоявшегося русского перевода нет, также такой синтаксис называют «стандартным» или «обычным» объявлением функции. Чуть дальше мы посмотрим другие варианты создания функций.&lt;br /&gt;
&lt;br /&gt;
Позвольте еще раз выделить основной смысл объявления Function Declaration:&lt;br /&gt;
&lt;br /&gt;
'''При объявлении функции создается переменная со значением-функцией. Не функция, а переменная с таким значением. Почувствуйте разницу.'''&lt;br /&gt;
&lt;br /&gt;
Другими словами, объявление &lt;br /&gt;
 function func(параметры) { код } &lt;br /&gt;
говорит интерпретатору: «создай переменную func, и положи туда функцию с указанными параметрами и кодом».&lt;br /&gt;
&lt;br /&gt;
При этом func — на самом деле не «имя функции», оно совсем никак (по стандарту) не привязано к функции! Это название переменной, в которую будет помещена функция, и из которой она может быть затем удалена, скопирована в другую переменную, и в результате её как func вызвать будет нельзя:&lt;br /&gt;
   &lt;br /&gt;
 function func() { }&lt;br /&gt;
 var g = func;&lt;br /&gt;
 func = null;&lt;br /&gt;
 func(); // ошибка! надо g()&lt;br /&gt;
&lt;br /&gt;
В частности, невозможно иметь функцию и переменную с одинаковым именем:&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
 // Нонсенс!&lt;br /&gt;
 function f() { } // объявить переменную f и записать в нее функцию&lt;br /&gt;
 var f = 5; // объявить переменную f (а она уже объявлена) и присвоить 5&lt;br /&gt;
 alert(f); // 5&lt;br /&gt;
&lt;br /&gt;
В примере выше переменная f в первой строке получает значение — функцию, а во второй — число 5. В итоге мы получим переменную со значением f=5.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Время создания Function Declaration ===&lt;br /&gt;
&lt;br /&gt;
Функции, объявленные как Function Declaration, создаются в момент входа в область видимости.&lt;br /&gt;
&lt;br /&gt;
Буквально, происходит следующее. Браузер видит скрипт. Сканирует его на предмет наличия Function Declaration — и для каждого создаёт функцию. (примечание — вложенные функции пока не трогаем, которые будут рассмотрены позже). А потом начинает выполнять код.&lt;br /&gt;
&lt;br /&gt;
Поэтому функцию можно вызывать до объявления:&lt;br /&gt;
&lt;br /&gt;
 sayHi(&amp;quot;Вася&amp;quot;);&lt;br /&gt;
 function sayHi(name) {&lt;br /&gt;
  alert(&amp;quot;Привет, &amp;quot; + name);&lt;br /&gt;
 }&lt;br /&gt;
Этот код будет работать, т.к. объявление function sayHi обрабатывается и функция создается до выполнения первой строчки кода.&lt;br /&gt;
&lt;br /&gt;
'''Условно объявить функцию через Function Declaration нельзя'''&lt;br /&gt;
&lt;br /&gt;
Попробуем, в зависимости от условия, объявить функцию по-разному:&lt;br /&gt;
&lt;br /&gt;
 var age = 18;&lt;br /&gt;
 if (age &amp;gt;= 18) {&lt;br /&gt;
   function sayHi() {  alert('Прошу вас!');  }&lt;br /&gt;
 } else {&lt;br /&gt;
   function sayHi() {  alert('До 18 нельзя'); }&lt;br /&gt;
 }&lt;br /&gt;
 sayHi();&lt;br /&gt;
&lt;br /&gt;
Какой вызов сработает?&lt;br /&gt;
&lt;br /&gt;
Чтобы это понять — вспомним, как работают функции.&lt;br /&gt;
&lt;br /&gt;
Объявления обрабатываются до выполнения первой строчки кода.&lt;br /&gt;
Браузер сканирует код и создает из таких объявлений функции. При этом второе объявление перезапишет первое.&lt;br /&gt;
&lt;br /&gt;
Дальше, во время выполнения объявления игнорируются (они уже обработаны), как если бы код был таким:&lt;br /&gt;
&lt;br /&gt;
 var age = 18;&lt;br /&gt;
 if (age &amp;gt;= 18) {} &lt;br /&gt;
 else {}&lt;br /&gt;
 sayHi();&lt;br /&gt;
&lt;br /&gt;
Как видно, конструкция if ни на что не влияет.&lt;br /&gt;
&lt;br /&gt;
Это — правильное с точки зрения спецификации поведение. На момент написания этого раздела браузер Firefox обрабатывал этот код некорректно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Объявление Function Expression ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Существует альтернативный синтаксис для создания функций. Функцию можно создать и присвоить переменной как самое обычное значение: var f = функция.&lt;br /&gt;
&lt;br /&gt;
Соответствующий способ объявления называется Function Expression и выглядит так:&lt;br /&gt;
&lt;br /&gt;
 var f = function(параметры) {&lt;br /&gt;
  // тело функции&lt;br /&gt;
 }&lt;br /&gt;
В этом объявлении после function нет имени, создается «анонимная функция», которая затем присваивается переменной.&lt;br /&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
  &lt;br /&gt;
 var sayHi = function(person) {&lt;br /&gt;
     alert(&amp;quot;Привет, &amp;quot; + person);&lt;br /&gt;
 }&lt;br /&gt;
 sayHi('Вася');&lt;br /&gt;
&lt;br /&gt;
В отличие от объявлений Function Declaration, которые создаются заранее, до выполнения кода, объявления Function Expression создают функцию, когда до них доходит выполнение.&lt;br /&gt;
&lt;br /&gt;
Поэтому и пользоваться ими можно только после объявления.&lt;br /&gt;
&lt;br /&gt;
 sayHi(); // &amp;lt;-- работать не будет, функции еще нет&lt;br /&gt;
 var sayHi = function() {  alert(1)  };&lt;br /&gt;
&lt;br /&gt;
А вот так — будет:&lt;br /&gt;
&lt;br /&gt;
 var sayHi = function() {  alert(1)  };&lt;br /&gt;
 sayHi(); // 1&lt;br /&gt;
&lt;br /&gt;
Благодаря этому свойству Function Expression можно (и даже нужно) использовать для условного объявления функции:&lt;br /&gt;
&lt;br /&gt;
 var age = prompt('Сколько вам лет?');&lt;br /&gt;
 var sayHi;&lt;br /&gt;
 if (age &amp;gt;= 18) {&lt;br /&gt;
   sayHi = function() {  alert('Вход разрешен');  }&lt;br /&gt;
 } else {&lt;br /&gt;
   sayHi = function() {  alert('Извините, вы слишком молоды');  }&lt;br /&gt;
 }&lt;br /&gt;
 sayHi(); // запустит ту из двух функций, которая присвоена выше &lt;br /&gt;
&lt;br /&gt;
=== Вызов «на месте» ===&lt;br /&gt;
&lt;br /&gt;
Можно создать функцию при помощи Function Expression и не присваивать ее переменной, а тут же вызвать:&lt;br /&gt;
&lt;br /&gt;
 (function() {&lt;br /&gt;
   var a, b; // локальные переменные   &lt;br /&gt;
   // код&lt;br /&gt;
 })();&lt;br /&gt;
Так делают, чтобы выполнить код, не загрязняя общую область видимости его локальными переменными.&lt;br /&gt;
&lt;br /&gt;
Например, эта практика используется в библиотеках и фреймворках JavaScript. Дело в том, что библиотека при своей инициализации может использовать временные переменные и функции, которые могут конфликтовать с другим кодом.&lt;br /&gt;
&lt;br /&gt;
Заключение таких переменных в функцию позволяет гарантировать отсутствие конфликтов с a и b из внешнего кода.&lt;br /&gt;
&lt;br /&gt;
Поэтому вызов инициализации оборачивается в функцию и вызывается «на месте».&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Зачем скобки вокруг функции? ===&lt;br /&gt;
&lt;br /&gt;
В примере выше вокруг function() {...} находятся скобки. Если записать без них - такой код вызовет ошибку:&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
 function() {&lt;br /&gt;
  // syntax error&lt;br /&gt;
 }();&lt;br /&gt;
Эта ошибка произойдет потому, что браузер, видя ключевое слово function в основном потоке кода, попытается прочитать Function Declaration, а здесь даже имени нет.&lt;br /&gt;
&lt;br /&gt;
Впрочем, даже если имя поставить, то работать тоже не будет:&lt;br /&gt;
   &lt;br /&gt;
 function work() {&lt;br /&gt;
  // ...&lt;br /&gt;
 }()  // syntax error&lt;br /&gt;
&lt;br /&gt;
Дело в том, что «на месте» разрешено вызывать только Function Expression.&lt;br /&gt;
&lt;br /&gt;
'''Общее правило таково:'''&lt;br /&gt;
&lt;br /&gt;
'''Если браузер видит function в основном потоке кода - он считает, что это Function Declaration.&lt;br /&gt;
Если же function идёт в составе более сложного выражения, то он считает, что это Function Expression.&lt;br /&gt;
Для этого и нужны скобки - показать, что у нас Function Expression, который по правилам JavaScript можно вызвать «на месте».'''&lt;br /&gt;
&lt;br /&gt;
Можно показать это другим способом, например так:&lt;br /&gt;
 +function() { ... }()&lt;br /&gt;
Или так:&lt;br /&gt;
 0*function() { ... }()&lt;br /&gt;
&lt;br /&gt;
Главное, чтобы интерпретатор понял, что это Function Expression, тогда он позволит вызвать функцию «на месте».&lt;br /&gt;
&lt;br /&gt;
Скобки не нужны, если это и так Function Expression, например в таком вызове:&lt;br /&gt;
&lt;br /&gt;
 var res = function(a,b) { return a+b }(2,2);&lt;br /&gt;
 alert(res); // 4&lt;br /&gt;
&lt;br /&gt;
Функция здесь создаётся как часть выражения присваивания, поэтому является Function Expression.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Для Function Expression тоже ставьте скобки ===&lt;br /&gt;
&lt;br /&gt;
Технически, если функция заведомо является Function Expression, то она может быть вызвано «на месте» без скобок:&lt;br /&gt;
&lt;br /&gt;
 var result = function(a,b) {&lt;br /&gt;
   return a*b;&lt;br /&gt;
 }(2,3);&lt;br /&gt;
Но из соображений стиля и читаемости скобки вокруг function рекомендуется ставить:&lt;br /&gt;
&lt;br /&gt;
 var result = (function(a,b) {&lt;br /&gt;
   return a*b;&lt;br /&gt;
 })(2,3);&lt;br /&gt;
Тогда сразу видно, что в result записывается не сама функция (result = function...), а идёт «вызов на месте». При чтении такого кода меньше ошибок.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Создание через new Function ==&lt;br /&gt;
&lt;br /&gt;
Существует еще один способ создания функции, который использует прямой вызов встроенного конструктора Function. Он принимает список аргументов и тело в виде строки, и генерирует функцию по ним:&lt;br /&gt;
   &lt;br /&gt;
 var sayHi = new Function('name', ' alert(&amp;quot;Привет, &amp;quot;+name) ');&lt;br /&gt;
 sayHi(&amp;quot;Вася&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Этот способ используется очень редко.&lt;br /&gt;
&lt;br /&gt;
==Предпочитайте Function Declaration==&lt;br /&gt;
В коде неопытных разработчиков зачастую можно увидеть много функций, объявленных как Function Expression:&lt;br /&gt;
&lt;br /&gt;
 ... код ...&lt;br /&gt;
 var f = function() { ... }&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
То же самое с Function Declaration будет короче и читабельнее:&lt;br /&gt;
&lt;br /&gt;
 ... код ...&lt;br /&gt;
 function f() { ... }&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Дополнительный бонус - такие функции можно вызывать до того, как они объявлены.&lt;br /&gt;
&lt;br /&gt;
Используйте Function Expression только там, где это действительно нужно. Например, для объявления функции в зависимости от условий.&lt;br /&gt;
&lt;br /&gt;
== Итого ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Функции в JavaScript являются значениями. Их можно присваивать, передавать, создавать в любом месте кода.&lt;br /&gt;
&lt;br /&gt;
*Если функция объявлена в основном потоке кода, то это Function Declaration.&lt;br /&gt;
*Если функция создана как часть выражения, то это Function Expression.&lt;br /&gt;
*Между этими двумя основными способами создания функций есть следующие различия:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! ||Function Declaration||Function Expression&lt;br /&gt;
|-&lt;br /&gt;
| Время создания||До выполнения первой строчки кода.||Когда управление достигает строки с функцией.&lt;br /&gt;
|-&lt;br /&gt;
|Можно вызвать до объявления||Да (т.к. создается заранее)||Нет&lt;br /&gt;
|-&lt;br /&gt;
|Можно объявить в if||Нет (т.к. создается заранее)||Да&lt;br /&gt;
|-&lt;br /&gt;
|Можно вызывать «на месте»||Нет (ограничение синтаксиса JavaScript)||Да&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>imported&gt;Supportadmin</name></author>
	</entry>
</feed>