Базовые вопросы по JavaScript Flashcards

1
Q

Объясните делегирование событий

A

Всплытие событий позволяет реализовать один из самых важных приёмов разработки - делегирование.

Он заключается в том, что если у нас есть много элементов, события на которых нужно обрабатывать похожим образом, то вместо того, чтобы назначать обработчик каждому - мы ставим один обработчик на их общего предка. Из него можно получить целевой элемент event.target, понять на каком потомке произошло событие и обработать его.

Алгоритм:

Вешаем обработчик на контейнер.
В обработчике: получаем event.target.
В обработчике: если event.target или один из его родителей в контейнере (this) – интересующий нас элемент – обрабатываем его.
Зачем использовать:

Упрощает инициализацию и экономит память: не нужно вешать много обработчиков.
Меньше кода: при добавлении и удалении элементов не нужно ставить или снимать обработчики.
Удобство изменений: можно массово добавлять или удалять элементы путём изменения innerHTML.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Объясните, как this работает в JavaScript

A

Использование this гарантирует, что функция работает именно с тем объектом, в контексте которого вызвана, если это не стрелочная функция. У стрелочных функций контекст this определяется в момент создания функции.

Значение this называется контекстом вызова и будет определено в момент вызова функции. Значением this является объект перед точкой, в контексте которого вызван метод.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Расскажите, как работает прототипное наследование

A

Прототипом объекта А называется объект B, свойства и методы которого доступны для объекта A как собственные.

У любого объекта есть прототип, на который указывает его свойство __proto__ и который также является объектом.
У любой функции есть ассоциированный с ней объект, на который в контексте функции указывает свойство prototype. В него как в контейнер обычно складывают свойства и методы для работы с определенным классом объектов.
Такой контейнер автоматически становится прототипом объектов, создаваемых функциями-конструкторами
Для редактирования прототипной ссылки объекта используют метод Object.create() - он перезаписывает объект заново и выставляет в нем ссылку на нужный прототип.
Ссылки связанных друг с другом объектов образуют прототипную цепочку, которая лежит в основе прототипного наследования. Ярким примером такого наследования является цепочка узлов DOM модели.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Что такое замыкание и как/для чего его используют

A

Если одна функция определена внутри другой, то внутренняя имеет доступ к ОВ внешней. Это называется замыканием (а также “лексической ОВ” или “статическая”.
При выполнении функции используется та область видимости переменных, которая существовала на момент объявления этой функции. Это лексическая область видимости.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Можете ли вы описать основное различие между циклом forEach и циклом .map()? И в каких случаях каждый из них используется?

A

forEach перебирает массив и не изменяет его.
.map() создает копию массива и изменяет копию.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

В каких случаях обычно используются анонимные функции?

A

Анонимные функции часто используются для выполнения какого-то кода в коллбэках, где не нужно создавать отдельную именную функцию под это действие.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

В чем разница между .call и .apply

A

Сходство заключается в том, что и .call, и .apply используются для вызова функций, а также первый параметр будет использоваться как значение this внутри функции. А разница в том, что .call в качестве следующих аргументов принимает аргументы, разделенные запятыми, в то время как .apply в качестве следующих аргументов принимает массив аргументов.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

В чем разница между: function Person(){}, var person = Person(), и var person = new Person()?

A

function Person(){} - Мы создаем функцию с именем Person.
var person = Person() - Мы вызываем функцию Person и результат сохраняем в переменную person.
var person = new Person() - Мы создаем новый объект, используя функцию-конструктор Person.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Что такое замыкание и как/для чего его используют?

A

Если одна функция определена внутри другой, то внутренняя имеет доступ к ОВ внешней. Это называется замыканием (а также “лексической ОВ” или “статическая”.
При выполнении функции используется та область видимости переменных, которая существовала на момент объявления этой функции. Это лексическая область видимости.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Что делает и для чего нужна функция Function.prototype.bind?

A

Метод bind() создает новую функцию, которая при вызове устанавливает в качестве контекста выполнения this предоставленное значение. В метод также передается набор аргументов, которые будут установлены перед переданными в привязанную функцию аргументами при ее вызове.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

что такое поднятие (hoisting) переменных

A

Поднятие (hoisting) — это термин, используемый для объяснения поведения объявлений переменных в коде. Переменные, объявленные при помощи ключевого слова var, будут перемещены в верхнюю часть текущей области, что мы называем “поднятием”. Поднимается только объявление переменной, присвоение значения (если оно имеется) останется на прежнем месте.

При объявлении функции её тело поднимается наверх, в то время как у функциональных выражений (когда переменной присваивается функция) поднимается только переменная.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Объясните, что такое всплытие событий (event bubbling)

A

При наступлении события, обработчики сначала срабатывают на самом вложенном элементе, затем на его родителе, затем выше и так далее, вверх по цепочке вложенности.
Всплытие событий является механизмом, на котором основано делегирование событий.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

В чём разница между == и ===?

A

== - это оператор абстрактного сравнения, а === - оператор строгого сравнения. Оператор == будет сравнивать на равенство после выполнения любых необходимых преобразований типов. Оператор === не будет выполнять преобразование типов, поэтому, если два занчения не одного типа, === просто вернет false.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Объясните same-origin policy в контексте JavaScript.

A

Same-origin policy (принцип одинакового источника) не позволяет JS выполнять запросы за границами домена. Источник определяется как комбинация схемы URI, имени хоста и номера порта. Этот принцип не позволяет вредоносному сценарию на одной странице получить доступ к конфиденциальным данным на другой через объектную модель документа этой страницы.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Что делает строчка “use strict”;? Какие достоинства и недостатки от её использования?

A

use strict’ это директива, используемая для включения строгого режима во всем скрипте или отдельных функциях.

Преимущества

Не позволяет случайно создавать глобальные переменные.
Любое присваивание, которое в обычном режиме завершается неудачей, в строгом режиме выдаст исключение.
При попытке удалить неудаляемые свойства выдаст исключение (в то время как в нестрогом режиме никакого действия бы не произошло).
Требует, чтобы имена параметров функции были уникальными.
this в глобальной области видимости равно undefined.
Перехватывает распространённые ошибки, выдавая исключения.
Исключает неочевидные особенности языка.
Недостатки

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Что такое промисы?

A

Промис — это объект, который может вернуть одно значение в будущем: либо выполненное значение, либо причину, по которой оно не было выполнено (например, произошла ошибка сети). Промис может находиться в одном из 3 возможных состояний: выполнено, отклонено или ожидает выполнения. При использовании промисов можно добавлять callback-функции для обработки выполненного значения или причины отказа.

17
Q

Какие преимущества и недостатки при использовании промисов вместо колбэков (callbacks)?

A

Преимущества

Помогает избежать “callback hell”, который может быть нечитаемым.
Упрощает написание последовательного удобочитаемого асинхронного кода с помощью then().
Упрощает написание параллельного асинхронного кода с помощью Promise.all().
С использованием промисов можно избежать следующих проблем: колбэк-функция была вызвана слишком рано, поздно или вовсе не была вызвана; функция была вызвана слишком мало или слишком много раз; не удалось передать необходимую среду/параметры; были пропущены ошибки/исключения.
Недостатки

Чуть более сложный код.
В старых браузерах, где не поддерживается ES2015, нужно загрузить полифил, чтобы их использовать.

18
Q

Объясните разницу между синхронными и асинхронными функциями.

A

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

Асинхронные функции обычно принимают callback-функцию в качестве параметра, и выполнение продолжается на следующей строке сразу после вызова асинхронной функции. Callback-функция вызывается только тогда, когда асинхронная операция завершена и стек вызовов пуст. Ресурсоемкие операции, такие как загрузка данных с веб сервера или запросы к базе данных, должны выполняться асинхронно, чтобы основной поток мог продолжать выполнять другие операции вместо блокировки до завершения этой долгой операции (в случае браузеров пользовательский интерфейс будет зависать).

19
Q

Что такое цикл событий (event loop)? В чём разница между стеком вызовов (call stack) и очередью событий (task queue)?

A

С помощью механизма Event Loop (Цикл событий) становится возможным выполнять асинхронный код в JavaScript.

Event Loop - это специальный механизм на уровне движка js, который координирует работу трёх сущностей: Call Stack (стэк вызовов), Web API (API, предоставляемый браузером), Callback Queue (очередь колбэков).

Работают они следующим образом: движок js анализирует код. Когда он встречает вызов какой-то функции, он перемещает эту функцию в Call Stack. Если эта функция синхронная (например, console.log()), то она сразу же исполняется, покидает стэк и на её место приходит следующая функция. Если же эта функция асинхронная, например, setTimeout(), обработчик событий, сетевой запрос и т.д., то на помощь приходит браузер со своим Web API (мы же помним, что JavaScript - это однопоточный язык, и сам работать в многопоточном режиме он не может). Event Loop перемещает колбэк асинхронной функции в Web API, а сама асинхронная функция уходит из стэка вызовов. То есть, пока колбэк асинхронной функции находится под управлением Web API, движок js продолжает выполнять другие операции!

Что же происходит с колбэком? В случае, например, setTimeout(), Web API ожидает истечения указанного времени, затем Event Loop перемещает этот колбэк в Callback Queue (очередь колбэков). Когда стэк вызовов освобождается, Event Loop перемещает в него наш колбэк из очереди колбэков, после чего колбэк наконец исполняется и покидает стэк вызовов.

Этот процесс повторяется до тех пор, пока весь js код не будет выполнен.

20
Q

Объясните разницу при использовании foo в function foo() {} и var foo = function() {}

A

Первое - объявление функции, а второе - функциональное выражение. Ключевое отличие состоит в том, что тело функции при объявлении поднимается наверх, а тело функциональных выражения - нет (они имеют такое же поведение поднятия, что и переменные).

21
Q

В чём различие между переменными, созданными при помощи let, var и const?

A

Переменные, объявленные при помощи ключевого слова var, относятся к области видимости функции, в которой они созданы. Или, если они созданы вне какой-либо функции, — к глобальному объекту. let и const относятся к блочной области видимости — это означает, что они доступны только в пределах ближайшего набора фигурных скобок (функция, блок if-else или цикл for).

var позволяет поднимать переменные и на них можно ссылаться в коде до их объявления. let const не позволяют этого и выдают ошибку.

Переопределение переменной с помощью var не вызовет ошибку, в отличие от let и const.

let отличается от const тем, что изменять значение const нельзя.

22
Q

Можете ли вы привести пример использования стрелочных функции =>? Чем они отличаются от других функций?

A

Преимуществом стрелочных функций является упрощение синтаксиса, необходимого для создания функций, без необходимости использования ключевого слова function. this внутри стрелочных функций также привязано к замыкающей области видимости, в отличие от обычных функций, где this определяется контекстом, в котором они вызываются. Лексически привязанное this полезно при вызове callback-функций, особенно в компонентах React.

23
Q

Дайте определение функции высшего порядка.

A

Функция высшего порядка — это любая функция, которая принимает одну или несколько функций в качестве аргументов, которые она использует для работы с данными, и/или возвращает функцию в качестве результата. Классическим примером является метод map, который принимает массив и функцию в качестве аргументов. Затем map использует эту функцию для преобразования каждого элемента в массиве, возвращая новый массив с преобразованными данными. Другими популярными примерами в JS являются forEach, filter и reduce.

24
Q

В чем разница между async и defer?

A

Специальные атрибуты async и defer используются для того, чтобы пока грузится внешний скрипт – браузер показал остальную (следующую за ним) часть страницы. Без них этого не происходит. Разница между async и defer: атрибут defer сохраняет относительную последовательность скриптов, а async – нет. Кроме того, defer всегда ждёт, пока весь HTML-документ будет готов, а async – нет.