что такое замыкание js

Аватар пользователя Aleksey
Aleksey
04 апреля 2023

"Замыкание" - это способность функции запоминать переменные, которые были определены внутри родительской функции, даже после того, как родительская функция была выполнена.

Пример:

function createCounter() {
  // переменная, которую нужно запомнить
  let count = 0;

  function counter() {
    // увеличиваем нашу запомненную переменную
    count++;
    console.log(count);
  }

  // возвращаем функцию
  return counter;
}

// создаем новую функцию (с замыканием)
const incrementCounter = createCounter();

incrementCounter(); // 1
incrementCounter(); // 2
incrementCounter(); // 3

В этом примере мы создали функцию createCounter(), которая создает другую функцию counter(). Внутри функции мы создали переменную count, которая была определена внутри родительской функции. Функция counter() возвращает значение count, увеличивая его на 1. Когда мы вызываем createCounter(), она возвращает функцию counter(), которая имеет доступ к count благодаря замыканию. Каждый раз, когда мы вызываем incrementCounter(),

Если мы создадим новый счетчик с помощью функции createCounter(), то отсчет для него начнется заново.

// Создали еще одну новую функци-счетчик
const newIncrementCounter = createCounter();

newIncrementCounter(); // 1
newIncrementCounter(); // 2
newIncrementCounter(); // 3
8 0
Аватар пользователя Olga Pejenkova
Olga Pejenkova
10 июня 2024

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

Когда объявляется функция внутри другой функции, внутренняя функция формирует замыкание. Это замыкание предоставляет внутренней функции доступ к:

  1. Своим собственным переменным (локальные переменные).
  2. Переменным внешней функции.
  3. Глобальным переменным.

Пример:

const createPlayer = (initialScore) => {
  let score = initialScore; // Приватная переменная, доступная только через замыкание

  return {
    getScore: function() {
      return score;
    },
    addScore: function(amount) {
      score += amount;
    }
  };
}

const player1 = createPlayer(100);
const player2 = createPlayer(50);

console.log(player1.getScore()); // 100
player1.addScore(50);
console.log(player1.getScore()); // 150

console.log(player2.getScore()); // 50 

// Невозможно изменить "очки" напрямую:
player1.score = 10; // Error! "score" не доступен извне
console.log(player1.getScore()); // 150 (значение не изменилось)
3 0

Есть что добавить? Зарегистрируйтесь

или войдите в аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Курсы по программированию в Хекслете

Программирование

Веб-разработка

Разработка, верстка и деплой сайтов и веб-приложений, трудоустройство для разработчиков

Frontend-разработка

Разработка внешнего интерфейса сайтов и веб-приложений и верстка

Создание сайтов

Разработка сайтов и веб-приложений на JS, Python, Java, PHP и Ruby on Rails

Backend-разработка

Разработка серверной части сайтов и веб-приложений

Тестирование

Ручное тестирование и автоматизированное тестирование на JS, Python, Java и PHP

Аналитика данных

Сбор, анализ и интерпретация данных на Python

Интенсивные курсы

Интенсивное обучение для продолжающих

DevOps

Автоматизация настройки локального окружения и серверов, развертывания и деплоя

Математика для программистов

Обучение разделам математики, которые будут полезны при изучении программирования

Тест-драйв

JavaScript

Разработка сайтов и веб-приложений и автоматизированное тестирование на JS

Python

Веб-разработка, автоматическое тестирование и аналитика данных на Python

Java

Веб-разработка и автоматическое тестирование на Java

PHP

Веб-разработка и автоматическое тестирование на PHP

Ruby

Разработка сайтов и веб-приложений на Ruby on Rails

Go

Курсы по веб-разработке на языке Go

HTML

Современная верстка с помощью HTML и CSS

SQL

Проектирование базы данных, выполнение SQL-запросов и изучение реляционных СУБД

Git

Система управления версиями Git, регулярные выражения и основы командой строки

Бесплатные курсы

Бесплатные курсы по тестированию, дата-аналитике, верстке, программированию на Python, Java, PHP и JavaScript.

Похожие вопросы

1
ответ
1
ответ
1
ответ