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
- 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
+
exportdefaultfunctionsum(x) {
4312
+
return x + x;
4313
+
}
4314
+
4315
+
// index.js
4316
+
import*assumfrom'./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
+
exportconstname='Lydia';
4334
+
exportconstage=21;
4335
+
exportdefault'I love JavaScript';
4336
+
4337
+
// index.js
4338
+
import*asinfofrom'./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:functionsum(x) { return x + x } }
4356
+
```
4357
+
4358
+
Следовательно, мы можем вызвать эту функцию используя `sum.default`
4359
+
4360
+
</p>
4361
+
</details>
4362
+
4363
+
---
4364
+
4365
+
###### 135. Что будет на выходе?
4366
+
4367
+
```javascript
4368
+
consthandler= {
4369
+
set: () =>console.log('Added a new property!'),
4370
+
get: () =>console.log('Accessed a property!'),
4371
+
};
4372
+
4373
+
constperson=newProxy({}, handler);
4374
+
4375
+
person.name='Lydia';
4376
+
person.name;
4377
+
```
4378
+
4379
+
- A: `Added a newproperty!`
4380
+
- B: `Accessed a property!`
4381
+
- C: `Added a newproperty!``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
+
constperson= { name:'Lydia Hallie' };
4406
+
4407
+
Object.seal(person);
4408
+
```
4409
+
4410
+
- A: `person.name="Evan Bacon"`
4411
+
- B: `person.age=21`
4412
+
- C: `deleteperson.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
+
Однако, изменение существующих свойств остаётся доступным.
0 commit comments