Skip to content

Commit 53c1104

Browse files
committed
2 parents f5ff6ff + da3b43f commit 53c1104

6 files changed

Lines changed: 26 additions & 28 deletions

File tree

1-js/4-data-structures/9-array-iteration/article.md

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
Метод ["arr.forEach(callback[, thisArg])"](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach) используется для перебора массива.
1010

11-
Он для каждого элемента массива вызывает функцию `callback`.
11+
Он для каждого элемента массива вызывает функцию `callback`.
1212

1313
Этой функции он передаёт три параметра `callback(item, i, arr)`:
1414

@@ -120,17 +120,17 @@ alert( arr.some(isPositive) ); // true, есть хоть одно положи
120120

121121
Кроме `callback`, методу можно передать "начальное значение" -- аргумент `initialValue`. Если он есть, то на первом вызове значение `previousValue` будет равно `initialValue`, а если у `reduce` нет второго аргумента, то оно равно первому элементу массива, а перебор начинается со второго.
122122

123-
Проще всего понять работу метода `reduce` на примере.
123+
Проще всего понять работу метода `reduce` на примере.
124124

125-
Например, в качестве "свёртки" мы хотим получить сумму всех элементов массива.
125+
Например, в качестве "свёртки" мы хотим получить сумму всех элементов массива.
126126

127127
Вот решение в одну строку:
128128

129129
```js
130130
//+ run
131131
var arr = [1, 2, 3, 4, 5]
132132

133-
// для каждого элемента массива запустить функцию,
133+
// для каждого элемента массива запустить функцию,
134134
// промежуточный результат передавать первым аргументом далее
135135
var result = arr.reduce(function(sum, current) {
136136
return sum + current;
@@ -212,13 +212,11 @@ var result = arr.reduce(function(sum, current) {
212212
alert( result ); // 15
213213
```
214214

215-
Результат -- точно такой же! Это потому, что при отсутствии `initialValue` в качестве первого значения берётся первый элемент массива, а перебор стартует со второго.
215+
Результат -- точно такой же! Это потому, что при отсутствии `initialValue` в качестве первого значения берётся первый элемент массива, а перебор стартует со второго.
216216

217217
Таблица вычислений будет такая же, за вычетом первой строки.
218218

219-
**Метод [arr.reduceRight](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/reduceRight) работает аналогично, но идёт по массиву справа-налево:**
220-
221-
219+
**Метод [arr.reduceRight](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/reduceRight) работает аналогично, но идёт по массиву справа-налево.**
222220

223221
## Итого
224222

@@ -232,4 +230,4 @@ alert( result ); // 15
232230
</ul>
233231

234232
Во многих ситуациях их использование позволяет написать код короче и понятнее, чем обычный перебор через `for`.
235-
233+

1-js/5-functions-closures/6-memory-management/article.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
</ul>
1818

1919
Эти значения гарантированно хранятся в памяти. Мы будем называть их *корнями*.
20-
</li>
20+
</li>
2121
<li>**Любое другое значение сохраняется в памяти лишь до тех пор, пока доступно из корня по ссылке или цепочке ссылок.**</li>
2222
</ol>
2323

@@ -31,7 +31,7 @@
3131

3232
### Достижимость и наличие ссылок
3333

34-
Есть одно упрощение для работы с памятью: "значение остаётся в памяти, пока на него есть ссылка".
34+
Есть одно упрощение для работы с памятью: "значение остаётся в памяти, пока на него есть хотя бы одна ссылка".
3535

3636
Но такое упрощение будет верным лишь в одну сторону.
3737

@@ -47,7 +47,7 @@ var user = {
4747
user = null;
4848
```
4949

50-
Теперь объект `{ name: "Вася" }` более недоступен. Память будет освобождена.
50+
Теперь объект `{ name: "Вася" }` более недоступен. Память будет освобождена.
5151
</li>
5252
<li>**Неверно -- в другую сторону: наличие ссылки не гарантирует, что значение останется в памяти.**
5353

@@ -62,9 +62,9 @@ petya.friend = vasya;
6262
vasya = petya = null;
6363
```
6464

65-
Несмотря на то, что на объекты `vasya`, `petya` ссылаются друг на друга через ссылку `friend`, то есть можно сказать, что на каждый из них есть ссылка, последняя строка делает эти объекты в совокупности недостижимыми.
65+
Несмотря на то, что на объекты `vasya`, `petya` ссылаются друг на друга через ссылку `friend`, то есть можно сказать, что на каждый из них есть ссылка, последняя строка делает эти объекты в совокупности недостижимыми.
6666

67-
Поэтому они будут удалены из памяти.
67+
Поэтому они будут удалены из памяти.
6868

6969
Здесь как раз и играет роль "достижимость" -- оба этих объекта становятся недостижимы из корней, в первую очередь, из глобальной области, стека.
7070

@@ -138,7 +138,7 @@ window.family = null;
138138
Как видим, объекты в конструкции всё ещё связаны между собой. Однако, поиск от корня их не находит, они не достижимы, и значит сборщик мусора удалит их из памяти.
139139

140140
[smart header="Оптимизации"]
141-
Проблема описанного алгоритма -- в больших задержках. Если объектов много, то на поиск всех достижимых уйдёт довольно много времени. А ведь выполнение скрипта при этом должно быть остановлено, уже просканированные объекты не должны поменяться до окончания процесса. Получатся небольшие, но неприятные паузы-зависания в работе скрипта.
141+
Проблема описанного алгоритма -- в больших задержках. Если объектов много, то на поиск всех достижимых уйдёт довольно много времени. А ведь выполнение скрипта при этом должно быть остановлено, уже просканированные объекты не должны поменяться до окончания процесса. Получатся небольшие, но неприятные паузы-зависания в работе скрипта.
142142

143143
Поэтому современные интерпретаторы применяют различные оптимизации.
144144

@@ -157,7 +157,7 @@ function showTime() {
157157

158158
## Замыкания
159159

160-
Объекты переменных, о которых шла речь ранее, в главе про замыкания, также подвержены сборке мусора. Они следуют тем же правилам, что и обычные объекты.
160+
Объекты переменных, о которых шла речь ранее, в главе про замыкания, также подвержены сборке мусора. Они следуют тем же правилам, что и обычные объекты.
161161

162162
Объект переменных внешней функции существует в памяти до тех пор, пока существует хоть одна внутренняя функция, ссылающаяся на него через свойство `[[Scope]]`.
163163

@@ -206,7 +206,7 @@ function f() {
206206
return function() {};
207207
}
208208

209-
// 3 функции, каждая ссылается на свой объект переменных,
209+
// 3 функции, каждая ссылается на свой объект переменных,
210210
// каждый со своим значением value
211211
var arr = [f(), f(), f()];
212212
```
@@ -224,15 +224,15 @@ function f() {
224224
}
225225

226226
var g = f(); // функция g жива
227-
// а значит в памяти остается соответствующий объект переменных f()
227+
// а значит в памяти остается соответствующий объект переменных f()
228228

229229
g = null; // ..а вот теперь память будет очищена
230230
```
231231

232232
</li>
233233
</ul>
234234

235-
### Оптимизация в V8 и её последствия
235+
### Оптимизация в V8 и её последствия
236236

237237
Современные JS-движки делают оптимизации замыканий по памяти. Они анализируют использование переменных и в случае, когда переменная из замыкания абсолютно точно не используется, удаляют её.
238238

@@ -286,7 +286,7 @@ g();
286286
Это не глюк отладчика, а особенность работы V8, которая, возможно, будет когда-нибудь изменена. Вы всегда сможете проверить, не изменилось ли чего, запустив примеры на этой странице.
287287
[/warn]
288288

289-
## Влияние управления памятью на скорость
289+
## Влияние управления памятью на скорость
290290

291291
На создание новых объектов и их удаление тратится время. Это важно иметь в виду в случае, когда важна производительность.
292292

@@ -319,8 +319,8 @@ timeRecursion = performance.now() - timeRecursion;
319319
alert( "Разница в " + (timeRecursion / timeLoop) + " раз" );
320320
```
321321

322-
Различие в скорости на таком примере может составлять, в зависимости от интерпретатора, 2-10 раз.
322+
Различие в скорости на таком примере может составлять, в зависимости от интерпретатора, 2-10 раз.
323323

324324
Вообще, этот пример -- не показателен. Ещё раз обращаю ваше внимание на то, что такие искусственные "микротесты" часто врут. Правильно их делать -- отдельная наука, которая выходит за рамки этой главы. Но и на практике ускорение в 2-10 раз оптимизацией по количеству объектов (и вообще, любых значений) -- отнюдь не миф, а вполне достижимо.
325325

326-
В реальной жизни в большинстве ситуаций такая оптимизация несущественна, просто потому что "JavaScript и так достаточно быстр". Но она может быть эффективной для "узких мест" кода.
326+
В реальной жизни в большинстве ситуаций такая оптимизация несущественна, просто потому что "JavaScript и так достаточно быстр". Но она может быть эффективной для "узких мест" кода.

1-js/6-objects-more/3-constructor-new/4-calculator-extendable/_js.view/solution.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ function Calculator() {
2020
return NaN;
2121
}
2222

23-
return methods[op](+a, +b);
23+
return methods[op](a, b);
2424
}
2525

2626
this.addMethod = function(name, func) {
2727
methods[name] = func;
2828
};
29-
}
29+
}

1-js/9-prototypes/5-class-inheritance/4-clock-class-extended/solution.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,3 @@
33
```js
44
//+ src="extended-clock.js"
55
```
6-
7-
[edit src="solution"]Открыть полное решение в редакторе[/edit]

7-frames-and-windows/1-window-methods/article.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,12 +122,14 @@ alert(newWin.location.href); // (*) about:blank, загрузка ещё не н
122122
newWin.onload = function() {
123123

124124
// создать div в документе нового окна
125-
var div = *!*newWin*/!*.document.createElement('div');
125+
var div = *!*newWin*/!*.document.createElement('div'),
126+
body = newWin.document.body;
127+
126128
div.innerHTML = 'Добро пожаловать!'
127129
div.style.fontSize = '30px'
128130

129131
// вставить первым элементом в body нового окна
130-
body.insertBefore(div, newWin.document.body.firstChild);
132+
body.insertBefore(div, body.firstChild);
131133
}
132134
```
133135

figures.sketch

-784 KB
Binary file not shown.

0 commit comments

Comments
 (0)