В апреле я опубликую небольшую серию блогов под названием «Вопросы из прошлого». Я просматриваю свои старые блокноты с первого года работы разработчиком и отвечаю на вопросы, которые считаю наиболее важными. Сегодня мы рассмотрим замыкания и обратные вызовы в Javascript.

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

Представьте, что у вас есть функция, которая определяет переменную, например:

function outerFunction() {
  let outerVariable = "Hiiii!";

  function innerFunction() {
    console.log(outerVariable);
  }
  
  return innerFunction;
}

const inner = outerFunction();
inner(); // logs "Hiiii!" to the console

В этом примере innerFunction имеет доступ к outerVariable, даже если он не определен внутри самого innerFunction. Это связано с тем, что innerFunction закрывает outerVariable, создавая замыкание, которое позволяет получить доступ к значению переменной даже после завершения выполнения outerFunction.

Обратные вызовы
Обратный вызов — это функция, которая передается в качестве аргумента другой функции и выполняется позже. Вот пример:

function doSomething(num1, num2, callback) {
  let result = num1 + num2;
  callback(result);
}

function logResult(result) {
  console.log(`The result is ${result}`);
}

doSomething(3, 4, logResult); // logs "The result is 7" to the console

В этом примере logResult — это функция обратного вызова, которая передается в качестве аргумента функции doSomething. Когда выполняется doSomething, он выполняет операцию над num1 и num2, а затем вызывает функцию обратного вызова, передавая результат в качестве аргумента. В этом случае выполняется logResult, и результат записывается в консоль.

Вот и все! Как только вы разберетесь с замыканиями и обратными вызовами, вы сможете писать более качественный и эффективный код.