Объекты имеют более общую природу: они являются неупорядоченными наборами произвольных значений с доступом по ключу. Иначе говоря, вы обращаетесь к элементам по строковому имени (ключу или свойству) вместо числовой позиции (как в случае с массивами).
Допустим, в этой программе уже определена переменная firstName, содержащая строковое значение "Kyle". В этом случае строка, заключенная в ограничители `, заменяет переменное выражение (обозначенное символами ${ .. }) его текущим значением. Такая замена называется интерполяцией.
Когда функция создает ссылки на переменные из внешней области видимости, а потом эта функция передается как значение и выполняется в других областях видимости, она сохраняет доступ к переменным исходной области видимости; в этом состоит суть замыкания.
Первая особенность обычно называется поднятием (hoisting): все переменные, объявленные в любой точке области видимости, интерпретируются так, словно объявлены в ее начале.
Область видимости статична, и она содержит фиксированный набор переменных, доступных в конкретный момент и в точке, в которой определяется функция. Контекст выполнения функции динамичен, и он полностью зависит от того, как вызывается функция (независимо от того, где она определена и даже откуда вызывается).
Цель связывания прототипов (т. е. от объекта B к объекту A) заключается в том, чтобы обращения к свойствам/методам объекта B, отсутствующим в B, делегировались A для обработки
Преимуществом this-зависимых функций — и их динамического контекста — является их способность более гибко повторно использовать одну функцию с данными из разных объектов. Функция, которая замыкается по области видимости, не может ссылаться на другую область видимости или набор переменных.
Все функции по умолчанию хранят ссылку на пустой объект в свойстве с именем prototype. Название создает путаницу: это не прототип функции (с которым функция связывается прототипической связью), а объект-прототип, с которым должна устанавливаться связь при создании других объектов вызовом функции с new.