You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/06-advanced-functions/06-function-object/5-sum-many-brackets/solution.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,5 +1,5 @@
1
1
2
-
1. В общем, чтобы это *хоть как-нибудь* заработало результат, возвращаемый `sum`, должен быть функцией.
2
+
1. В общем, чтобы это *хоть как-нибудь* заработало, результат, возвращаемый `sum`, должен быть функцией.
3
3
2. Между вызовами эта функция должна удерживать в памяти текущее значение счётчика.
4
4
3. Согласно заданию, функция должна преобразовываться в число когда она используется в операции `==`. Функции -- объекты, так что преобразование происходит как описано в главе <info:object-toprimitive>, и мы можем предоставить наш собственный метод, возвращающий число.
5
5
@@ -52,4 +52,4 @@ function f(b) {
52
52
}
53
53
```
54
54
55
-
Функция `f` будет использоваться в последующем вызове, и снова возвращать себя столько раз, сколько будет необходимо. Затем, при использовании в качестве числа или строки, метод `toString` возвращает `currentSum` -- число. Также здесь мы можем использовать `Symbol.toPrimitive` или `valueOf` для преобразования.
55
+
Функция `f` будет использоваться в последующем вызове, и снова возвращать себя столько раз, сколько будет необходимо. Затем при использовании в качестве числа или строки, метод `toString` возвращает `currentSum` -- число. Также здесь мы можем использовать `Symbol.toPrimitive` или `valueOf` для преобразования.
Как мы видим, объект рест-параметров не считается.
94
+
Как мы видим, оставшиеся параметры не считаются.
95
95
96
96
Свойство `length` иногда используется для [интроспекций](https://ru.wikipedia.org/wiki/Интроспекция_(программирование)) в функциях, которые работают с другими функциями.
97
97
98
-
Например, в коде ниже, функция `ask` принимает параметр `question` чтобы задать вопрос, и произвольное количество функций-обработчиков `handler`.
98
+
Например, в коде ниже функция `ask` принимает параметр `question` чтобы задать вопрос, а также `handler`, произвольное количество функций-обработчиков.
99
+
99
100
100
101
Когда пользователь отвечает на вопрос, функция вызывает обработчики. Мы можем передать два типа обработчиков:
101
102
102
-
- Функцию без аргументов, которая будет вызываться только в случае позитивного ответа.
103
+
- Функцию без аргументов, которая будет вызываться только в случае положительного ответа.
103
104
- Функцию с аргументами, которая будет вызываться в обоих случаях и возвращать ответ.
104
105
105
106
Идея состоит в том, что у нас есть простой синтаксис обработчика без аргументов для положительных ответов (наиболее распространённый случай), и, также реализована возможность передавать универсальные обработчики.
@@ -205,11 +206,11 @@ alert( counter() ); // 10
205
206
206
207
Поэтому выбор реализации зависит от наших целей.
207
208
208
-
## Именованные Функциональные Выражения
209
+
## Named Function Expression
209
210
210
-
Именованные Функциональные Выражения -- это термин для функциональных выражений у которых есть имя.
211
+
Named Function Expression, или NFE -- это термин для Function Expression у которого есть имя.
211
212
212
-
Например, давайте объявим обычное Функциональное Выражение:
213
+
Например, давайте объявим Function Expression:
213
214
214
215
```js
215
216
letsayHi=function(who) {
@@ -227,7 +228,7 @@ let sayHi = function *!*func*/!*(who) {
227
228
228
229
Чего мы здесь достигли? Какова цель этого дополнительного имени `func`?
229
230
230
-
Для начала отметим, что у нас все ещё есть Функциональное Выражение. Добавление `"func"` после `function` не делает функцию декларативной, потому, что она все еще является частью выражения присваивания.
231
+
Для начала отметим, что у нас все ещё есть Function Expression. Добавление `"func"` после `function` не превращает его в Function Declaration, потому что оно все еще является частью выражения присваивания.
231
232
232
233
Также и добавление такого имени ничего ломает.
233
234
@@ -246,7 +247,7 @@ sayHi("John"); // Hello, John
246
247
1. Оно позволяет функции ссылаться на себя же.
247
248
2. Оно не доступно за пределами функции.
248
249
249
-
Например, ниже, функция `sayHi` вызывает себя с `"Guest"`, если не передан параметр `who`:
250
+
Например, ниже функция `sayHi` вызывает себя с `"Guest"`, если не передан параметр `who`:
250
251
251
252
```js run
252
253
letsayHi=function*!*func*/!*(who) {
@@ -262,10 +263,10 @@ let sayHi = function *!*func*/!*(who) {
262
263
sayHi(); // Hello, Guest
263
264
264
265
// Но это не сработает в случае:
265
-
func(); // Ошибка, func неопределена (недоступна вне функции)
266
+
func(); // Ошибка, func не определена (недоступна вне функции)
266
267
```
267
268
268
-
Почему мы используем `func`? Почему, просто ни использовать `sayHi` для вложенного вызова?
269
+
Почему мы используем `func`? Почему просто не использовать `sayHi` для вложенного вызова?
269
270
270
271
На самом деле, в большинстве случаев это возможно:
271
272
@@ -302,9 +303,9 @@ welcome(); // Ошибка, вложенный вызов sayHi больше н
302
303
303
304
Так происходит потому, что функция берет `sayHi` из её внешнего лексического окружения. Так как локальная переменная `sayHi` отсутствует, используется внешняя. И на момент вызова эта внешняя `sayHi` равна `null`.
304
305
305
-
Опциональное имя, которое мы можем вставить в Функциональное Выражение, как раз и призвано решать такого рода проблемы.
306
+
Необязательное имя, которое можно вставить в Function Expression, как раз и призвано решать такого рода проблемы.
Внешний код все еще содержит переменные `sayHi` и `welcome`, но теперь `func` -- это "внутреннее имя функции", таким образом она может вызвать себя изнутри.
329
330
330
-
```smart header="С Декларативными Функциями это не работает"
331
-
Трюк с "внутренним" именем, описанный выше, работает только для Функционального Выражения, и *не* работает для Декларарованных Функций. Для последних, синтаксис не предусматривает возможность объявить "дополнительное внутреннее" имя.
331
+
```smart header="Это не работает с Function Declaration"
332
+
Трюк с "внутренним" именем, описанный выше, работает только для Function Expression, и *не* работает для Function Declaration. Для Function Declaration, синтаксис не предусматривает возможность объявить "дополнительное внутреннее" имя.
332
333
333
-
Зачастую, когда нам нужно надёжное "внутреннее" имя, стоит переписать Декларированную Функцию на Именованное Функциональное Выражение.
334
+
Зачастую, когда нам нужно надёжное "внутреннее" имя, стоит переписать Function Declaration на Named Function Expression.
-`name` -- имя функции. Устанавливается при декларативном объявлении функции, и может быть установлено как значение свойства объекта.
343
-
-`length` -- количество аргументов в объявлении функции. Объект рест-параметров не считается.
344
+
-`length` -- количество аргументов в объявлении функции. Оставшиеся параметры не считаются.
344
345
345
-
Если функция объявлена как Функциональное Выражение (вне основного потока кода), и имеет имя, тогда это называется Именованным Функциональным Выражением. Это имя может быть использовано для ссылки на себя же, для рекурсивных вызовов и т.п.
346
+
Если функция объявлена как Function Expression (вне основного потока кода), и имеет имя, тогда это называется Именованным Функциональным Выражением. Это имя может быть использовано для ссылки на себя же, для рекурсивных вызовов и т.п.
346
347
347
348
Также, функции могут содержать дополнительные свойства. Многие широко известные JavaScript библиотеки искусно используют эту возможность.
0 commit comments