Лексическое окружение - это состояние, которое создается при выполнении кода JavaScript. Оно содержит переменные, функции и другие объекты, которые были определены во время выполнения кода, а также ссылки на лексические окружения, которые были созданы при выполнении вложенных функций.
const sayHi = (name) => {
const greeting = 'Hello, my name is';
return `${greeting} ${name}`;
}
console.log(greeting); // ReferenceError: greeting is not defined, так как greeting локальная переменная
console.log(sayHi('Jack')); // "Hello, my name is Jack"
// Замыкания (Closures)
const createPhrase = (greeting) => {
return (name) => `${greeting} ${name}`; // Исправлена синтаксическая ошибка (лишняя кавычка)
};
const sayHi = createPhrase('Hello');
console.log(sayHi('Vadim')); // "Hello Vadim"
const sayBye = createPhrase('Bye');
console.log(sayBye('Ilya')); // "Bye Ilya"
Замыкание - это способность функции запоминать свое лексическое окружение во время ее создания и использовать его во время выполнения, даже если функция вызывается в другом месте.
Пример использования лексического окружения и замыкания в JavaScript:
function add(a) {
return function (b) {
return a + b
}
}
const addFive = add(5)
console.log(addFive(3)) // 8
console.log(addFive(7)) // 12
В этом примере мы определяем функцию add
, которая возвращает другую функцию, которая складывает два числа. Функция add
использует замыкание, чтобы запомнить значение переменной a
, которое было передано ей в качестве аргумента. Затем мы создаем новую функцию addFive
, передав ей значение 5, и используем ее для сложения чисел 3 и 7.
Еще один пример использования замыкания:
function counter() {
let count = 0
return function () {
count++
console.log(count)
}
}
const increment = counter()
increment() // 1
increment() // 2
increment() // 3
В этом примере мы определяем функцию counter
, которая возвращает другую функцию, которая увеличивает и выводит на экран счетчик. Функция counter
использует замыкание, чтобы запомнить значение переменной count
. Затем мы создаем новую функцию increment
, которая вызывает функцию, возвращенную counter
, и используем ее для увеличения и вывода значения счетчика при каждом вызове.