Skip to content

Commit 7e94cad

Browse files
committed
Установка и уменьшение значение счётчика
1 parent 8e52e62 commit 7e94cad

3 files changed

Lines changed: 26 additions & 25 deletions

File tree

1-js/06-advanced-functions/06-function-object/2-counter-inc-dec/task.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ importance: 5
22

33
---
44

5-
# Set и decrease для счётчика
5+
# Установка и уменьшение значение счётчика
66

77
Изменить код `makeCounter()` так чтобы счетчик мог увеличивать и устанавливать значение:
88

1-js/06-advanced-functions/06-function-object/5-sum-many-brackets/solution.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
1. В общем, чтобы это *хоть как-нибудь* заработало результат, возвращаемый `sum`, должен быть функцией.
2+
1. В общем, чтобы это *хоть как-нибудь* заработало, результат, возвращаемый `sum`, должен быть функцией.
33
2. Между вызовами эта функция должна удерживать в памяти текущее значение счётчика.
44
3. Согласно заданию, функция должна преобразовываться в число когда она используется в операции `==`. Функции -- объекты, так что преобразование происходит как описано в главе <info:object-toprimitive>, и мы можем предоставить наш собственный метод, возвращающий число.
55

@@ -52,4 +52,4 @@ function f(b) {
5252
}
5353
```
5454

55-
Функция `f` будет использоваться в последующем вызове, и снова возвращать себя столько раз, сколько будет необходимо. Затем, при использовании в качестве числа или строки, метод `toString` возвращает `currentSum` -- число. Также здесь мы можем использовать `Symbol.toPrimitive` или `valueOf` для преобразования.
55+
Функция `f` будет использоваться в последующем вызове, и снова возвращать себя столько раз, сколько будет необходимо. Затем при использовании в качестве числа или строки, метод `toString` возвращает `currentSum` -- число. Также здесь мы можем использовать `Symbol.toPrimitive` или `valueOf` для преобразования.

1-js/06-advanced-functions/06-function-object/article.md

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
# Функциональный объект, Именованные Функциональные Выражения
2+
# Функциональный объект, NFE
33

44
Как мы уже знаем, в JavaScript функции -- это значения.
55

@@ -44,7 +44,7 @@ function f(sayHi = function() {}) {
4444
f();
4545
```
4646

47-
В спецификации, это называется "контекстное имя". Если функция не предоставляет этого свойства, то его значение определяется из контекста.
47+
В спецификации это называется "контекстное имя". Если функция не предоставляет этого свойства, то его значение определяется из контекста.
4848

4949
Также имена имеют и методы объекта:
5050

@@ -68,11 +68,11 @@ alert(user.sayBye.name); // sayBye
6868
В этом нет никакой магии. Бывает, что корректное имя определить невозможно. В таких случаях свойство name имеет пустое значение. Например:
6969

7070
```js
71-
// функция объявлена внутри массива
71+
// функция объявлена внутри массива
7272
let arr = [function() {}];
7373

7474
alert( arr[0].name ); // <пустая строка>
75-
// здесь отсутствует возможность определить имя, поэтому оно неопределено
75+
// здесь отсутствует возможность определить имя, поэтому его нет
7676
```
7777

7878
Тем не менее, на практике большинство функций имена имеют.
@@ -84,22 +84,23 @@ alert( arr[0].name ); // <пустая строка>
8484
```js run
8585
function f1(a) {}
8686
function f2(a, b) {}
87-
function many(a, b, ...more) {},
87+
function many(a, b, ...more) {}
8888

8989
alert(f1.length); // 1
9090
alert(f2.length); // 2
9191
alert(many.length); // 2
9292
```
9393

94-
Как мы видим, объект рест-параметров не считается.
94+
Как мы видим, оставшиеся параметры не считаются.
9595

9696
Свойство `length` иногда используется для [интроспекций](https://ru.wikipedia.org/wiki/Интроспекция_(программирование)) в функциях, которые работают с другими функциями.
9797

98-
Например, в коде ниже, функция `ask` принимает параметр `question` чтобы задать вопрос, и произвольное количество функций-обработчиков `handler`.
98+
Например, в коде ниже функция `ask` принимает параметр `question` чтобы задать вопрос, а также `handler`, произвольное количество функций-обработчиков.
99+
99100

100101
Когда пользователь отвечает на вопрос, функция вызывает обработчики. Мы можем передать два типа обработчиков:
101102

102-
- Функцию без аргументов, которая будет вызываться только в случае позитивного ответа.
103+
- Функцию без аргументов, которая будет вызываться только в случае положительного ответа.
103104
- Функцию с аргументами, которая будет вызываться в обоих случаях и возвращать ответ.
104105

105106
Идея состоит в том, что у нас есть простой синтаксис обработчика без аргументов для положительных ответов (наиболее распространённый случай), и, также реализована возможность передавать универсальные обработчики.
@@ -205,11 +206,11 @@ alert( counter() ); // 10
205206

206207
Поэтому выбор реализации зависит от наших целей.
207208

208-
## Именованные Функциональные Выражения
209+
## Named Function Expression
209210

210-
Именованные Функциональные Выражения -- это термин для функциональных выражений у которых есть имя.
211+
Named Function Expression, или NFE -- это термин для Function Expression у которого есть имя.
211212

212-
Например, давайте объявим обычное Функциональное Выражение:
213+
Например, давайте объявим Function Expression:
213214

214215
```js
215216
let sayHi = function(who) {
@@ -227,7 +228,7 @@ let sayHi = function *!*func*/!*(who) {
227228

228229
Чего мы здесь достигли? Какова цель этого дополнительного имени `func`?
229230

230-
Для начала отметим, что у нас все ещё есть Функциональное Выражение. Добавление `"func"` после `function` не делает функцию декларативной, потому, что она все еще является частью выражения присваивания.
231+
Для начала отметим, что у нас все ещё есть Function Expression. Добавление `"func"` после `function` не превращает его в Function Declaration, потому что оно все еще является частью выражения присваивания.
231232

232233
Также и добавление такого имени ничего ломает.
233234

@@ -246,7 +247,7 @@ sayHi("John"); // Hello, John
246247
1. Оно позволяет функции ссылаться на себя же.
247248
2. Оно не доступно за пределами функции.
248249

249-
Например, ниже, функция `sayHi` вызывает себя с `"Guest"`, если не передан параметр `who`:
250+
Например, ниже функция `sayHi` вызывает себя с `"Guest"`, если не передан параметр `who`:
250251

251252
```js run
252253
let sayHi = function *!*func*/!*(who) {
@@ -262,10 +263,10 @@ let sayHi = function *!*func*/!*(who) {
262263
sayHi(); // Hello, Guest
263264

264265
// Но это не сработает в случае:
265-
func(); // Ошибка, func неопределена (недоступна вне функции)
266+
func(); // Ошибка, func не определена (недоступна вне функции)
266267
```
267268

268-
Почему мы используем `func`? Почему, просто ни использовать `sayHi` для вложенного вызова?
269+
Почему мы используем `func`? Почему просто не использовать `sayHi` для вложенного вызова?
269270

270271
На самом деле, в большинстве случаев это возможно:
271272

@@ -302,9 +303,9 @@ welcome(); // Ошибка, вложенный вызов sayHi больше н
302303

303304
Так происходит потому, что функция берет `sayHi` из её внешнего лексического окружения. Так как локальная переменная `sayHi` отсутствует, используется внешняя. И на момент вызова эта внешняя `sayHi` равна `null`.
304305

305-
Опциональное имя, которое мы можем вставить в Функциональное Выражение, как раз и призвано решать такого рода проблемы.
306+
Необязательное имя, которое можно вставить в Function Expression, как раз и призвано решать такого рода проблемы.
306307

307-
Давайте используем его чтобы все исправить:
308+
Давайте зададим имя функции, чтобы исправить код:
308309

309310
```js run
310311
let sayHi = function *!*func*/!*(who) {
@@ -327,10 +328,10 @@ welcome(); // Hello, Guest (вложенный вызов работает)
327328

328329
Внешний код все еще содержит переменные `sayHi` и `welcome`, но теперь `func` -- это "внутреннее имя функции", таким образом она может вызвать себя изнутри.
329330

330-
```smart header="С Декларативными Функциями это не работает"
331-
Трюк с "внутренним" именем, описанный выше, работает только для Функционального Выражения, и *не* работает для Декларарованных Функций. Для последних, синтаксис не предусматривает возможность объявить "дополнительное внутреннее" имя.
331+
```smart header="Это не работает с Function Declaration"
332+
Трюк с "внутренним" именем, описанный выше, работает только для Function Expression, и *не* работает для Function Declaration. Для Function Declaration, синтаксис не предусматривает возможность объявить "дополнительное внутреннее" имя.
332333
333-
Зачастую, когда нам нужно надёжное "внутреннее" имя, стоит переписать Декларированную Функцию на Именованное Функциональное Выражение.
334+
Зачастую, когда нам нужно надёжное "внутреннее" имя, стоит переписать Function Declaration на Named Function Expression.
334335
```
335336

336337
## Итого
@@ -340,9 +341,9 @@ welcome(); // Hello, Guest (вложенный вызов работает)
340341
Их свойства:
341342

342343
- `name` -- имя функции. Устанавливается при декларативном объявлении функции, и может быть установлено как значение свойства объекта.
343-
- `length` -- количество аргументов в объявлении функции. Объект рест-параметров не считается.
344+
- `length` -- количество аргументов в объявлении функции. Оставшиеся параметры не считаются.
344345

345-
Если функция объявлена как Функциональное Выражение (вне основного потока кода), и имеет имя, тогда это называется Именованным Функциональным Выражением. Это имя может быть использовано для ссылки на себя же, для рекурсивных вызовов и т.п.
346+
Если функция объявлена как Function Expression (вне основного потока кода), и имеет имя, тогда это называется Именованным Функциональным Выражением. Это имя может быть использовано для ссылки на себя же, для рекурсивных вызовов и т.п.
346347

347348
Также, функции могут содержать дополнительные свойства. Многие широко известные JavaScript библиотеки искусно используют эту возможность.
348349

0 commit comments

Comments
 (0)