«Вы не знаете JS: Scope & Closures» Кайла Симпсона — важное руководство для программистов на JavaScript, которые хотят лучше понять сложности области действия и замыканий. Эта книга является второй книгой из серии книг «Вы еще не знаете JS». Я рекомендую сначала прочитать «Вы не знаете JS: Up & Going», чтобы у вас было базовое представление о JS.

Следующее резюме представляет собой обзор основных концепций и идей книги, предлагая ценную информацию о JavaScript.

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

Замыкания, с другой стороны, — это мощная функция JavaScript, которая позволяет функциям запоминать и получать доступ к переменным в своей области видимости даже после того, как они покинули эту область. Это особенно полезно при работе с обратными вызовами, обработчиками событий или в других ситуациях, когда выполнение функции задерживается.

Лексическая область

Лексическая область видимости — это основная концепция правил области видимости JavaScript. Он устанавливается во время компиляции, что означает, что область действия переменной определяется ее положением в исходном коде. Область действия и область действия блока — это два способа создания новой области видимости в JavaScript. Переменные, объявленные внутри функции, являются локальными для этой функции и недоступны снаружи. С введением ES6 JavaScript поддерживает ключевые слова let и const для определения области блока, что позволяет более точно контролировать видимость переменных, что приводит к более чистому и удобному в сопровождении коду.

Возьмем следующий пример:

if (true) {
	const foo = "foo";
	console.log(foo); // "foo"
}

Оператор if вводит область действия блока с помощью оператора блока. Мы говорим, что foo ограничена оператором if. Это означает, что к нему можно получить доступ только из этого блока.

Если мы попытаемся получить доступ к foo за пределами блока, мы получим ReferenceError, потому что он выходит за рамки:

if (true) {
	const foo = "foo";
	console.log(foo); // "foo"
}
console.log(foo); // Uncaught ReferenceError: foo is not defined

Поднятие
Поднятие — это поведение в JavaScript, при котором объявления переменных и функций перемещаются в верхнюю часть соответствующих областей во время компиляции. Это может быть полезно для использования переменных и функций до того, как они будут объявлены в вашем коде. Однако подъем может привести к неожиданному поведению, если вы попытаетесь получить доступ к переменной до того, как ей было присвоено значение. Переменные, объявленные с помощью let и const, не поднимаются, и попытка доступа к ним до их объявления приводит к ошибке ReferenceError.

Оба следующих кода дадут одинаковый результат из-за подъема:

x = 5; // Assign 5 to x

elem = document.getElementById("demo"); // Find an element
elem.innerHTML = x;                     // Display x in the element

var x; // Declare x
var x; // Declare x
x = 5; // Assign 5 to x

elem = document.getElementById("demo"); // Find an element
elem.innerHTML = x; 

Выражение немедленно вызываемой функции

IIFE — это функциональное выражение, которое определяется и вызывается сразу после его создания. Это создает новую область и запускает функцию в этой области, эффективно изолируя переменные функции от глобальной области. Это полезный метод, позволяющий избежать загрязнения глобального пространства имен и управлять временем жизни переменных.

Замыкание
Замыкание — это ключевое понятие в JavaScript, которое позволяет функциям «запоминать» свое лексическое окружение. Когда функция определена внутри другой функции, эта функция имеет доступ к переменным внешней функции. Этот доступ сохраняется даже после завершения выполнения внешней функции, поэтому внутренняя функция может продолжать использовать эти переменные. Замыкания обычно используются в JavaScript для таких задач, как реализация закрытых переменных и инкапсуляция, создание фабрик функций и декораторов, а также работа с асинхронными обратными вызовами и обработчиками событий.

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

В целом книга You Don’t Know JS: My Scope & Closures дает исчерпывающее и глубокое представление об основных понятиях области действия и замыканий в JavaScript. Глубокое понимание этих концепций позволяет разработчикам писать более чистый, эффективный и удобный для сопровождения код. В книге также обсуждаются практические приложения и шаблоны проектирования, такие как IIFE, замыкания и различные модульные системы, что дает ценную информацию об использовании этих концепций в реальных проектах. Изучая темы, затронутые в книге, разработчики могут улучшить свои навыки и знания, что приведет к разработке более надежных и масштабируемых приложений. Эта книга с четкими пояснениями, практическими примерами и глубоким анализом ключевых понятий является обязательным ресурсом для всех, кто хочет углубить свое понимание внутренней работы JavaScript и вывести свои навыки программирования на новый уровень.

После этой книги во всей серии книг есть еще четыре книги, поэтому не стесняйтесь читать всю серию книг из этого источника.