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/article.md
+18-18Lines changed: 18 additions & 18 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -24,7 +24,7 @@ function sayHi() {
24
24
alert(sayHi.name); // sayHi
25
25
```
26
26
27
-
Что еще более забавно, логика назначения имен весьма умна. Она также назначает корректные имена для именованных функциональных выражений:
27
+
Что еще более забавно, логика назначения `name` довольно хитрая. Она присваивает корректное имя в случае, если функция создается без имени и тут же присваивается, вот так:
28
28
29
29
```js run
30
30
letsayHi=function() {
@@ -34,7 +34,7 @@ let sayHi = function() {
34
34
alert(sayHi.name); // sayHi (работает!)
35
35
```
36
36
37
-
Это также работает в случае, когда значение устанавливается как значение по умолчанию:
37
+
Это даже работает в случае присваивания значения по умолчанию:
38
38
39
39
```js run
40
40
functionf(sayHi=function() {}) {
@@ -44,7 +44,7 @@ function f(sayHi = function() {}) {
44
44
f();
45
45
```
46
46
47
-
В спецификации это называется "контекстное имя". Если функция не предоставляет этого свойства, то его значение определяется из контекста.
47
+
В спецификации это называется "контекстное имя": если функция не имеет name, то JavaScript пытается понять его из контекста.
// здесь отсутствует возможность определить имя, поэтому его нет
76
76
```
77
77
78
-
Тем не менее, на практике большинство функций имена имеют.
78
+
Впрочем, на практике такое бывает редко, обычно функции имеют`name`.
79
79
80
80
## Свойство "length"
81
81
@@ -91,19 +91,19 @@ alert(f2.length); // 2
91
91
alert(many.length); // 2
92
92
```
93
93
94
-
Как мы видим, оставшиеся параметрыне считаются.
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
-
Идея состоит в том, что у нас есть простой синтаксис обработчика без аргументов для положительных ответов (наиболее распространённый случай), а также реализована возможность передавать универсальные обработчики.
106
+
Идея состоит в том, чтобы иметь простой синтаксис обработчика без аргументов для положительных ответов (наиболее распространённый случай), но также и возможность передавать универсальные обработчики.
107
107
108
108
Чтобы вызвать `handlers` правильно, мы проверяем свойство `length`:
109
109
@@ -126,7 +126,7 @@ function ask(question, ...handlers) {
Это частный случай так называемого [Ad-hoc-полиморфизма](https://ru.wikipedia.org/wiki/Полиморфизм_(информатика)#Ad-hoc-полиморфизм) -- обработка аргументов в зависимости от их типа или, как в нашем случае -- от значения. Эта идея имеет применение в библиотеках JavaScript.
129
+
Это частный случай так называемого [Ad-hoc-полиморфизма](https://ru.wikipedia.org/wiki/Полиморфизм_(информатика)#Ad-hoc-полиморфизм) -- обработка аргументов в зависимости от их типа или, как в нашем случае -- от значения`length`. Эта идея имеет применение в библиотеках JavaScript.
Свойство функции назначенное как `sayHi.counter = 0`, не *объявляет* локальную переменную `counter` внутри неё. Другими словами, свойство `counter` и переменная `let counter` - это две независимые вещи.
155
+
Свойство функции, назначенное как `sayHi.counter = 0`, не *объявляет* локальную переменную `counter` внутри неё. Другими словами, свойство `counter` и переменная `let counter` - это две независимые вещи.
156
156
157
-
Мы можем использовать функцию как объект, хранить в ней свойства, но они никак не влияют на её выполнение. Переменные никогда не используют свойства функции и наоборот. Это как два параллельных мира.
157
+
Мы можем использовать функцию как объект, хранить в ней свойства, но они никак не влияют на её выполнение. Переменные -- это не свойства функции и наоборот. Это два параллельных мира.
158
158
```
159
159
160
160
Иногда свойства функции могут использоваться вместо замыканий. Например, мы можем переписать функцию-счетчик из главы <info:closure>, используя её свойство:
@@ -182,7 +182,7 @@ alert( counter() ); // 1
182
182
183
183
Это хуже или лучше, чем использовать замыкание?
184
184
185
-
Основное отличие в том, что если значение `count` живет во внешней переменной, то она не доступна для внешнего кода. Изменить её могут только вложенные функции. Если это связано с функцией, то мы можем получить следующее:
185
+
Основное отличие в том, что если значение `count` живет во внешней переменной, то она не доступна для внешнего кода. Изменить её могут только вложенные функции. А если оно присвоено как свойство функции, то мы можем его получить:
186
186
187
187
```js run
188
188
functionmakeCounter() {
@@ -228,9 +228,9 @@ let sayHi = function *!*func*/!*(who) {
228
228
229
229
Чего мы здесь достигли? Какова цель этого дополнительного имени `func`?
230
230
231
-
Для начала отметим, что у нас все ещё есть Function Expression. Добавление `"func"` после `function` не превращает его в Function Declaration, потому что оно все еще является частью выражения присваивания.
231
+
Для начала заметим, что функция все ещё задана как Function Expression. Добавление `"func"` после `function` не превращает его в Function Declaration, потому что оно все еще является частью выражения присваивания.
232
232
233
-
Также и добавление такого имени ничего ломает.
233
+
Добавление такого имени ничего не ломает.
234
234
235
235
Функция все еще доступна как `sayHi()`:
236
236
@@ -242,7 +242,7 @@ let sayHi = function *!*func*/!*(who) {
242
242
sayHi("John"); // Hello, John
243
243
```
244
244
245
-
В имени `func` есть две особенности:
245
+
Есть две важные особенности имени `func`:
246
246
247
247
1. Оно позволяет функции ссылаться на себя же.
248
248
2. Оно не доступно за пределами функции.
@@ -262,13 +262,13 @@ let sayHi = function *!*func*/!*(who) {
262
262
263
263
sayHi(); // Hello, Guest
264
264
265
-
//Но это не сработает в случае:
265
+
//А вот так - не cработает:
266
266
func(); // Ошибка, func не определена (недоступна вне функции)
267
267
```
268
268
269
269
Почему мы используем `func`? Почему просто не использовать `sayHi` для вложенного вызова?
270
270
271
-
На самом деле, в большинстве случаев это возможно:
271
+
Вообще, обычно мы можем так поступить:
272
272
273
273
```js
274
274
letsayHi=function(who) {
@@ -282,7 +282,7 @@ let sayHi = function(who) {
282
282
};
283
283
```
284
284
285
-
Но в этом коде проблемазаключается в том, что значение `sayHi` может быть изменено. Функция может перейти к другой переменной, и код начнет выдавать ошибки:
285
+
Однако, у этого кода есть проблема, которая заключается в том, что значение `sayHi` может быть изменено. Функция может быть присвоена другой переменной, и тогда код начнет выдавать ошибки:
286
286
287
287
```js run
288
288
letsayHi=function(who) {
@@ -305,7 +305,7 @@ welcome(); // Ошибка, вложенный вызов sayHi больше н
305
305
306
306
Необязательное имя, которое можно вставить в Function Expression, как раз и призвано решать такого рода проблемы.
setTimeout( () =>f(5), 1500); // ignored (less than 1000 ms from the last run)
22
22
```
23
23
24
-
In practice `debounce` is useful for functions that retrieve/update something when we know that nothing new can be done in such a short period of time, so it's better not to waste resources.
24
+
In practice `debounce` is useful for functions that retrieve/update something when we know that nothing new can be done in such a short period of time, so it's better not to waste resources.
0 commit comments