Closures в ECMAScript

Одной из самых трудных для понимания особенностей ECMAScript является поддержка closures (закрытых контекстов).

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

Простой пример closures

Использование глобальных переменных в ECMAScript является простым примером closures. Давайте подумаем о следующем фрагменте кода:

var sMessage = "hello world";
function sayHelloWorld() {
  alert(sMessage);
}
sayHelloWorld();

В этом фрагменте кода, после загрузки скрипта в память, не выполняется вычисление значения переменной sMessage для функции sayHelloWorld(). Эта функция захватывает значение sMessage только для будущих использований, то есть интерпретатор знает, что при вызове этой функции нужно проверить значение sMessage. sMessage будет присвоено значение при вызове функции sayHelloWorld() (в последней строке) и отобразит сообщение "hello world".

Сложный пример closures

Определение одной функции в другой делает closures более сложными. Например:

var iBaseNum = 10;
function addNum(iNum1, iNum2) {
  function doAdd() {
    return iNum1 + iNum2 + iBaseNum;
  }
  return doAdd();
}

Здесь функция addNum() включает функцию doAdd() (closure). Внутренняя функция является closure, так как она получает значения параметров iNum1 и iNum2 внешней функции и глобальной переменной iBaseNum. Последний шаг функции addNum() - это вызов doAdd(), который добавляет два параметра и глобальную переменную и возвращает их сумму.

Важно понять, что функция doAdd() не принимает параметры, а использует значения, полученные из окружения выполнения.

Как видно, closures - это очень мощная и универсальная часть ECMAScript, которую можно использовать для выполнения сложных вычислений.

Совет:Как и при использовании любого высокого уровня функции, использование closures требует осторожности, так как они могут стать очень сложными.