Skip to content

Commit 8291060

Browse files
committed
missed fixes
1 parent dbbf111 commit 8291060

2 files changed

Lines changed: 19 additions & 19 deletions

File tree

  • 1-js/06-advanced-functions

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

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ function sayHi() {
2424
alert(sayHi.name); // sayHi
2525
```
2626

27-
Что еще более забавно, логика назначения имен весьма умна. Она также назначает корректные имена для именованных функциональных выражений:
27+
Что еще более забавно, логика назначения `name` довольно хитрая. Она присваивает корректное имя в случае, если функция создается без имени и тут же присваивается, вот так:
2828

2929
```js run
3030
let sayHi = function() {
@@ -34,7 +34,7 @@ let sayHi = function() {
3434
alert(sayHi.name); // sayHi (работает!)
3535
```
3636

37-
Это также работает в случае, когда значение устанавливается как значение по умолчанию:
37+
Это даже работает в случае присваивания значения по умолчанию:
3838

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

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

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

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

78-
Тем не менее, на практике большинство функций имена имеют.
78+
Впрочем, на практике такое бывает редко, обычно функции имеют `name`.
7979

8080
## Свойство "length"
8181

@@ -91,19 +91,19 @@ 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`.
9999

100100

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

103103
- Функцию без аргументов, которая будет вызываться только в случае положительного ответа.
104104
- Функцию с аргументами, которая будет вызываться в обоих случаях и возвращать ответ.
105105

106-
Идея состоит в том, что у нас есть простой синтаксис обработчика без аргументов для положительных ответов (наиболее распространённый случай), а также реализована возможность передавать универсальные обработчики.
106+
Идея состоит в том, чтобы иметь простой синтаксис обработчика без аргументов для положительных ответов (наиболее распространённый случай), но также и возможность передавать универсальные обработчики.
107107

108108
Чтобы вызвать `handlers` правильно, мы проверяем свойство `length`:
109109

@@ -126,7 +126,7 @@ function ask(question, ...handlers) {
126126
ask("Вопрос?", () => alert('Вы ответили да'), result => alert(result));
127127
```
128128

129-
Это частный случай так называемого [Ad-hoc-полиморфизма](https://ru.wikipedia.org/wiki/Полиморфизм_(информатика)#Ad-hoc-полиморфизм) -- обработка аргументов в зависимости от их типа или, как в нашем случае -- от значения. Эта идея имеет применение в библиотеках JavaScript.
129+
Это частный случай так называемого [Ad-hoc-полиморфизма](https://ru.wikipedia.org/wiki/Полиморфизм_(информатика)#Ad-hoc-полиморфизм) -- обработка аргументов в зависимости от их типа или, как в нашем случае -- от значения `length`. Эта идея имеет применение в библиотеках JavaScript.
130130

131131
## Пользовательские свойства
132132

@@ -152,9 +152,9 @@ alert( `Вызвана ${sayHi.counter} раза` ); // Вызвана 2 раз
152152
```
153153

154154
```warn header="Свойство не есть переменная"
155-
Свойство функции назначенное как `sayHi.counter = 0`, не *объявляет* локальную переменную `counter` внутри неё. Другими словами, свойство `counter` и переменная `let counter` - это две независимые вещи.
155+
Свойство функции, назначенное как `sayHi.counter = 0`, не *объявляет* локальную переменную `counter` внутри неё. Другими словами, свойство `counter` и переменная `let counter` - это две независимые вещи.
156156
157-
Мы можем использовать функцию как объект, хранить в ней свойства, но они никак не влияют на её выполнение. Переменные никогда не используют свойства функции и наоборот. Это как два параллельных мира.
157+
Мы можем использовать функцию как объект, хранить в ней свойства, но они никак не влияют на её выполнение. Переменные -- это не свойства функции и наоборот. Это два параллельных мира.
158158
```
159159

160160
Иногда свойства функции могут использоваться вместо замыканий. Например, мы можем переписать функцию-счетчик из главы <info:closure>, используя её свойство:
@@ -182,7 +182,7 @@ alert( counter() ); // 1
182182

183183
Это хуже или лучше, чем использовать замыкание?
184184

185-
Основное отличие в том, что если значение `count` живет во внешней переменной, то она не доступна для внешнего кода. Изменить её могут только вложенные функции. Если это связано с функцией, то мы можем получить следующее:
185+
Основное отличие в том, что если значение `count` живет во внешней переменной, то она не доступна для внешнего кода. Изменить её могут только вложенные функции. А если оно присвоено как свойство функции, то мы можем его получить:
186186

187187
```js run
188188
function makeCounter() {
@@ -228,9 +228,9 @@ let sayHi = function *!*func*/!*(who) {
228228

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

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

233-
Также и добавление такого имени ничего ломает.
233+
Добавление такого имени ничего не ломает.
234234

235235
Функция все еще доступна как `sayHi()`:
236236

@@ -242,7 +242,7 @@ let sayHi = function *!*func*/!*(who) {
242242
sayHi("John"); // Hello, John
243243
```
244244

245-
В имени `func` есть две особенности:
245+
Есть две важные особенности имени `func`:
246246

247247
1. Оно позволяет функции ссылаться на себя же.
248248
2. Оно не доступно за пределами функции.
@@ -262,13 +262,13 @@ let sayHi = function *!*func*/!*(who) {
262262

263263
sayHi(); // Hello, Guest
264264

265-
// Но это не сработает в случае:
265+
// А вот так - не cработает:
266266
func(); // Ошибка, func не определена (недоступна вне функции)
267267
```
268268

269269
Почему мы используем `func`? Почему просто не использовать `sayHi` для вложенного вызова?
270270

271-
На самом деле, в большинстве случаев это возможно:
271+
Вообще, обычно мы можем так поступить:
272272

273273
```js
274274
let sayHi = function(who) {
@@ -282,7 +282,7 @@ let sayHi = function(who) {
282282
};
283283
```
284284

285-
Но в этом коде проблема заключается в том, что значение `sayHi` может быть изменено. Функция может перейти к другой переменной, и код начнет выдавать ошибки:
285+
Однако, у этого кода есть проблема, которая заключается в том, что значение `sayHi` может быть изменено. Функция может быть присвоена другой переменной, и тогда код начнет выдавать ошибки:
286286

287287
```js run
288288
let sayHi = function(who) {
@@ -305,7 +305,7 @@ welcome(); // Ошибка, вложенный вызов sayHi больше н
305305

306306
Необязательное имя, которое можно вставить в Function Expression, как раз и призвано решать такого рода проблемы.
307307

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

310310
```js run
311311
let sayHi = function *!*func*/!*(who) {

1-js/06-advanced-functions/09-call-apply-decorators/03-debounce/task.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,4 @@ setTimeout( () => f(4), 1100); // runs
2121
setTimeout( () => f(5), 1500); // ignored (less than 1000 ms from the last run)
2222
```
2323

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

Comments
 (0)