Skip to content

Commit cc8c1d6

Browse files
authored
Merge pull request lydiahallie#535 from artmare/master
Add RU translation for 133-136
2 parents 570f2df + 1f8a31f commit cc8c1d6

File tree

1 file changed

+168
-0
lines changed

1 file changed

+168
-0
lines changed

ru-RU/README.md

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4255,3 +4255,171 @@ console.log(counterOne.count);
42554255
</p>
42564256
</details>
42574257
4258+
---
4259+
4260+
###### 133. Что будет на выходе?
4261+
4262+
```javascript
4263+
const myPromise = Promise.resolve(Promise.resolve('Promise!'));
4264+
4265+
function funcOne() {
4266+
myPromise.then(res => res).then(res => console.log(res));
4267+
setTimeout(() => console.log('Timeout!', 0));
4268+
console.log('Last line!');
4269+
}
4270+
4271+
async function funcTwo() {
4272+
const res = await myPromise;
4273+
console.log(await res);
4274+
setTimeout(() => console.log('Timeout!', 0));
4275+
console.log('Last line!');
4276+
}
4277+
4278+
funcOne();
4279+
funcTwo();
4280+
```
4281+
4282+
- A: `Promise! Last line! Promise! Last line! Last line! Promise!`
4283+
- B: `Last line! Timeout! Promise! Last line! Timeout! Promise!`
4284+
- C: `Promise! Last line! Last line! Promise! Timeout! Timeout!`
4285+
- D: `Last line! Promise! Promise! Last line! Timeout! Timeout!`
4286+
4287+
<details><summary><b>Ответ</b></summary>
4288+
<p>
4289+
4290+
#### Ответ: D
4291+
4292+
Сначала мы вызываем функцию `funcOne`. В первой строке `funcOne` происходит вызов обещания `myPromise`, которое является _асинхронной_ операцией. Пока движок занят обработкой обещания, он продолжает выполнение функции `funcOne`. Следующая строка является _асинхронной_ функцией `setTimeout`, поэтому её обратный вызов будет отправлен в Web API. (см. мою статью о цикле событий [здесь](https://dev.to/lydiahallie/javascript-visualized-event-loop-3dif).)
4293+
4294+
Обещание, как и таймер, является асинхронной операцией, поэтому функция продолжит выполняться несмотря на обработку обещания и обратного вызова `setTimeout`. Выходит так, что `Last line!` попадет в консоль первой, т.к. не является асинхронной операцией. Далее, в следующей строке `funcOne`, обещание будет выполнено и `Promise!` выводится в консоль. Однако, т.к. далее мы вызываем `funcTwo()`, стэк вызывов не будет пустым, из-за чего обратный вызов функции `setTimeout` _пока_ не будет добавлен в стэк вызовов.
4295+
4296+
В первой строке `funcTwo` мы _ожидаем_ выполнения обещания myPromise. С помощью ключевого слова `await` мы приостанавливаем выполнение функции пока обещание не будет выполнено (или отклонено). Затем выводим в консоль _ожидаемое_ значение `res` (т.к. предыдущее обещание вернуло обещание). После чего в консоль попадает `Promise!`.
4297+
4298+
Следующая строка является _асинхронной_ функцией `setTimeout`, которая отправляет обратный вызов в Web API.
4299+
4300+
Мы перешли к следующей строке функции `funcTwo` которая выводит в консоль `Last line!`. Теперь, когда стэк вызовов извлечен из `funcTwo`, он становится пустым. Обратные вызовы, которые ожидали очереди (`() => console.log("Timeout!")` из `funcOne`, и `() => console.log("Timeout!")` из `funcTwo`) добавлены в стэк вызовов один за другим. Первый вызов выведет в консоль `Timeout!` и будет извлечен из стэка. Следующий вызов также выведет `Timeout!` и тоже будет извлечен из стэка вызовов. Лог будет равен `Last line! Promise! Promise! Last line! Timeout! Timeout!`
4301+
4302+
</p>
4303+
</details>
4304+
4305+
---
4306+
4307+
###### 134. Как мы можем вызвать функцию `sum` в `sum.js` из `index.js?`
4308+
4309+
```javascript
4310+
// sum.js
4311+
export default function sum(x) {
4312+
return x + x;
4313+
}
4314+
4315+
// index.js
4316+
import * as sum from './sum';
4317+
```
4318+
4319+
- A: `sum(4)`
4320+
- B: `sum.sum(4)`
4321+
- C: `sum.default(4)`
4322+
- D: Нельзя импортировать значения по умолчанию используя `*`, только именованные экспорты
4323+
4324+
<details><summary><b>Ответ</b></summary>
4325+
<p>
4326+
4327+
#### Ответ: C
4328+
4329+
Используя звездочку `*`, мы импортируем все экспортируемые значения из файла, включая именнованные экспорты и экспорты по умолчанию. Если бы у нас был следующий файл:
4330+
4331+
```javascript
4332+
// info.js
4333+
export const name = 'Lydia';
4334+
export const age = 21;
4335+
export default 'I love JavaScript';
4336+
4337+
// index.js
4338+
import * as info from './info';
4339+
console.log(info);
4340+
```
4341+
4342+
В лог попадёт следующее:
4343+
4344+
```javascript
4345+
{
4346+
default: "I love JavaScript",
4347+
name: "Lydia",
4348+
age: 21
4349+
}
4350+
```
4351+
4352+
Для примера `sum` это означает, что импортированное значение `sum` будет таким:
4353+
4354+
```javascript
4355+
{ default: function sum(x) { return x + x } }
4356+
```
4357+
4358+
Следовательно, мы можем вызвать эту функцию используя `sum.default`
4359+
4360+
</p>
4361+
</details>
4362+
4363+
---
4364+
4365+
###### 135. Что будет на выходе?
4366+
4367+
```javascript
4368+
const handler = {
4369+
set: () => console.log('Added a new property!'),
4370+
get: () => console.log('Accessed a property!'),
4371+
};
4372+
4373+
const person = new Proxy({}, handler);
4374+
4375+
person.name = 'Lydia';
4376+
person.name;
4377+
```
4378+
4379+
- A: `Added a new property!`
4380+
- B: `Accessed a property!`
4381+
- C: `Added a new property!` `Accessed a property!`
4382+
- D: В лог ничего не попадёт
4383+
4384+
<details><summary><b>Ответ</b></summary>
4385+
<p>
4386+
4387+
#### Ответ: C
4388+
4389+
C помощью Proxy мы можем добавить собственное поведению объекту, которое мы передаем вторым аргументом. В нашем случае мы передаем объект `handler` который содержит свойства: `set` и `get`. `set` вызывается каждый раз когда мы _устанавливаем_ значения свойств, `get` же вызывается всякий раз когда мы _получаем_ значения свойств.
4390+
4391+
Первый аргумент — пустой объект `{}`, который является значением `person`. Для него будет добавлено собственное поведение, описанное в объекте `handler`. При добавлении значения для объекта `person` будет вызвано свойство `set`. При запросе к значению `person` вызовется свойство `get`.
4392+
4393+
Сначала мы устанавливаем новое свойство `name` для объекта Proxy (`person.name = "Lydia"`). Вызывается `set` и в лог попадает `"Added a new property!"`.
4394+
4395+
Затем мы обращаемся к значению Proxy-объекта. Вызывается свойство `get` объекта `handler`. `"Accessed a property!"` попадает в лог.
4396+
4397+
</p>
4398+
</details>
4399+
4400+
---
4401+
4402+
###### 136. Какое из перечисленных действий может модифицировать объект `person`?
4403+
4404+
```javascript
4405+
const person = { name: 'Lydia Hallie' };
4406+
4407+
Object.seal(person);
4408+
```
4409+
4410+
- A: `person.name = "Evan Bacon"`
4411+
- B: `person.age = 21`
4412+
- C: `delete person.name`
4413+
- D: `Object.assign(person, { age: 21 })`
4414+
4415+
<details><summary><b>Ответ</b></summary>
4416+
<p>
4417+
4418+
#### Ответ: A
4419+
4420+
С помощью `Object.seal` мы можем предотвращать как _добавление_ новых свойств, так и _удаление_ существующих.
4421+
4422+
Однако, изменение существующих свойств остаётся доступным.
4423+
4424+
</p>
4425+
</details>

0 commit comments

Comments
 (0)