Лексическое окружение - это состояние, которое создается при выполнении кода 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, и используем ее для увеличения и вывода значения счетчика при каждом вызове.


Назад