|
1 |
| -## Объявление функций и выражения с ними |
| 1 | +## Про объявление функций и выражения с ними |
2 | 2 |
|
3 |
| -Функции в JavaScript тоже являются объектами (шок, сенсация). Следовательно, их можно передавать и присваивать точно так же, как и любой другой объект. Одним из вариантов использования такой возможности является передача *анонимной функции* как функции обратного вызова в другую функцию — к примеру, для ассинхронных вызовов. |
| 3 | +Функции в JavaScript являются объектами. Следовательно, их можно передавать и присваивать точно так же, как и любой другой объект. Популярным сбособом использования этого свойства является передача *анонимной функции* в качестве функции обратного вызова в некую другую функцию — к примеру, при описании асинхронных вызовов. |
4 | 4 |
|
5 | 5 | ### Объявление `function`
|
6 | 6 |
|
7 | 7 | // всё просто и привычно
|
8 | 8 | function foo() {}
|
9 | 9 |
|
10 |
| -В следующем примере описанная функция [резервируется](#function.scopes) перед запуском всего скрипта; за счёт этого она доступна *в любом месте* кода, вне зависимости от того где она *определена* — даже если функция вызывается до её фактического объявления в коде. |
| 10 | +В следующем примереб ещё перед запуском всего скрипта, для описанной функции [резервируется](#function.scopes) переменная; за счёт этого она доступна *в любом месте* кода, вне зависимости от того, где она *определена* — даже если она вызывается заранее, перед её фактическим объявлением в коде (и сколь угодно задолго до такого определения). |
11 | 11 |
|
12 | 12 |
|
13 | 13 | foo(); // сработает, т.к. функция будет создана до выполнения кода
|
|
17 | 17 |
|
18 | 18 | var foo = function() {};
|
19 | 19 |
|
20 |
| -В этом примере безымянная и *анонимная* функция присваивается переменной `foo`. |
| 20 | +В конце этого примера переменной `foo` присваивается безымянная *анонимная* функция. |
21 | 21 |
|
22 | 22 | foo; // 'undefined'
|
23 | 23 | foo(); // вызовет TypeError
|
24 | 24 | var foo = function() {};
|
25 | 25 |
|
26 |
| -Так как в данном примере выражение `var` — это определение функции, переменная с именем `foo` будет заранее зарезервирована перед запуском скрипта (таким образом, `foo` уже будет определена во время его работы). |
| 26 | +Поскольку выражение с `var` *резервирует* имя переменной `foo` ещё до запуска кода, `foo` уже имеет некое значение во время его исполнения (отсутствует ошибка «`foo` is not defined»). |
27 | 27 |
|
28 |
| -Но поскольку присвоения исполняются непосредственно во время работы кода, `foo` по умолчанию будет присвоено значение [`undefined`](#core.undefined) (до обработки строки с определением функции): |
29 |
| - |
30 |
| - var foo; // переменная неявно резервируется |
31 |
| - foo; // 'undefined' |
32 |
| - foo(); // вызовет TypeError |
33 |
| - foo = function() {}; |
| 28 | +Но поскольку сами *присвоения* исполняются только непосредственно во время работы кода, `foo` по умолчанию будет иметь лишь значение [`undefined`](#core.undefined) (до обработки строки с определением функции). |
34 | 29 |
|
35 | 30 | ### Выражения с именованными фунциями
|
36 | 31 |
|
37 |
| -Существует еще ньюанс, касающийся именованных функций создающихся через присваивание: |
| 32 | +Существует еще один ньюанс, касающийся присваивания именованных функций: |
38 | 33 |
|
39 | 34 | var foo = function bar() {
|
40 | 35 | bar(); // работает
|
41 | 36 | }
|
42 | 37 | bar(); // получим ReferenceError
|
43 | 38 |
|
44 |
| -Здесь объект `bar` не доступен во внешней области, так как имя `bar` используется только для присвоения переменной `foo`; однако `bar` можно вызвать внутри функции. Такое поведение связано с особенностью работы JavaScript с [пространствами имен](#function.scopes) - имя функции *всегда* доступно в локальной области видимости самой функции. |
| 39 | +Здесь фукнция `bar` не доступна во внешней области видимости, так как она используется только для присвоения переменной `foo`; однако, внутри `bar` она неожиданно оказывается доступна. Такое поведение связано с особенностью работы JavaScript с [разыменованием](#function.scopes) - имя функции *всегда* доступно в локальной области видимости самой функции. |
45 | 40 |
|
0 commit comments