Область видимости
Что такое замыкание (Closures)?
Замыкание состоит из функции и доступного ей лексического окружения. Функция сохраняет доступ к внешним переменным, в том числе после завершения вызова, в котором она была создана.
Основные характеристики:
-
Доступ к внешним переменным:
-
Функция может сохранять доступ к переменным своей внешней функции.
-
Пример:
function outerFunction() { let outerVariable = 'I am outside!'; function innerFunction() { console.log(outerVariable); } return innerFunction; } const closure = outerFunction(); closure(); // "I am outside!"
-
-
Приватные переменные:
-
Замыкания могут использоваться для создания приватных переменных.
-
Пример:
function createCounter() { let count = 0; return function() { count++; return count; }; } const counter = createCounter(); console.log(counter()); // 1 console.log(counter()); // 2
-
Замыкания позволяют функции запоминать и получать доступ к переменным своей внешней функции, даже после завершения выполнения этой внешней функции.
Что такое поднятие (Hoisting)?
Hoisting описывает создание привязок до выполнения соответствующих строк кода, а не буквальное перемещение исходного текста. var заранее получает undefined; объявления функций обычно доступны для вызова; let и const нельзя читать до инициализации из-за TDZ.
Основные характеристики:
-
Переменные:
-
Объявления переменных (с
var) поднимаются вверх, но их инициализация остается на месте. -
Пример:
console.log(x); // undefined var x = 5;
-
-
Функции:
-
Объявления функций поднимаются полностью, включая тело функции.
-
Пример:
greet(); // "Hello" function greet() { console.log("Hello"); }
-
-
letиconst:-
Переменные, объявленные с помощью
letиconst, также поднимаются, но они находятся в “временной мертвой зоне” (TDZ) до инициализации. -
Пример:
console.log(y); // ReferenceError let y = 10;
-
Hoisting описывает создание привязок до выполнения соответствующих строк кода, а не буквальное перемещение исходного текста. var заранее получает undefined; объявления функций обычно доступны для вызова; let и const нельзя читать до инициализации из-за TDZ.
Что такое область видимости (Scope)?
Область видимости (
Scope
) — это контекст, в котором определяются и доступны переменные
и функции в JavaScript.
Основные виды:
-
Глобальная область видимости:
-
Переменные и функции, объявленные в глобальном контексте, доступны в любом месте кода.
-
Пример:
var globalVar = "I'm global"; function globalFunction() { console.log(globalVar); }
-
-
Функциональная область видимости:
-
Переменные, объявленные внутри функции, доступны только внутри этой функции.
-
Пример:
function myFunction() { var localVar = "I'm local"; console.log(localVar); } // console.log(localVar); // Ошибка: localVar не определена
-
-
Блочная область видимости:
-
Переменные, объявленные с помощью
letиconstвнутри блока ({}), доступны только внутри этого блока. -
Пример:
{ let blockVar = "I'm block-scoped"; console.log(blockVar); } // console.log(blockVar); // Ошибка: blockVar не определена
-
Область видимости определяет контекст, в котором переменные и функции доступны для использования в JavaScript, обеспечивая контроль над видимостью и временем жизни данных.
Какое значение имеет this?
this — это ключевое слово, которое ссылается на объект, к которому
принадлежит текущий контекст выполнения.
Основные контексты:
-
В глобальной области видимости:
-
В обычном браузерном скрипте на верхнем уровне this равен window. В ES-модуле он равен undefined, а на верхнем уровне модуля CommonJS в Node.js обычно равен module.exports.
-
Пример:
console.log(this); // В браузере выведет объект window
-
-
В методе объекта:
-
При вызове obj.method() обычная функция получает obj как this. Если извлечь метод и вызвать отдельно, this определяется новым способом вызова, а не объектом, где функция хранилась.
-
Пример:
const obj = { name: "Alice", getName: function() { return this.name; } }; console.log(obj.getName()); // "Alice"
-
-
В конструкторах и классах:
-
thisссылается на новый экземпляр объекта, создаваемый конструктором или классом. -
Пример:
function Person(name) { this.name = name; } const person = new Person("Bob"); console.log(person.name); // "Bob"
-
-
В функциях-стрелках:
-
Стрелочная функция не создаёт свой this, а использует его значение из окружающего лексического контекста. Это значение не меняют call, apply и bind.
-
Пример:
const obj = { name: "Alice", getName: () => this.name }; console.log(obj.getName()); // undefined, так как this ссылается на глобальный объект
-
Пример со стрелочной getName не читает obj.name. В браузерном скрипте он читает window.name; в ES-модуле обращение к this.name выбросит TypeError, потому что this равен undefined. Комментарий с undefined в примере не универсален.