Замыкания - это простой способ создания функций, которые зависят от параметров.Или, другими словами, для создания определенного экземпляра семейства функций (читайте дальше, если это не ясно) в зависимости от некоторого значения времени выполнения.
Javascript позволяет передавать функциивокруг как члены первого класса;так, например, вы можете обойти функцию, которая определяет, как объединить два целых числа, обращаясь к ней напрямую.
Однако, если пойти еще дальше, замыкание позволяет создать «настроенную» версию функции,чье точное поведение зависит от некоторой переменной времени выполнения (но в остальном она соответствует каркасу).
Например, вот функция, которая позволит curry добавление:
function getAddNFunction(n)
{
function inner(operand)
{
return n + operand;
}
return inner;
}
Теперь, если вы вызовете getAddNFunction(7)
, вы получите функцию, которая добавляет 7 к аргументу.Если вы вызовете getAddNFunction(42.5)
, вы получите функцию, которая добавляет 42,5 к аргументу.
Надеюсь, этот простой пример прояснит преимущество замыканий;они позволяют вам встраивать аргументы в функцию во время создания , а не передавать их во время выполнения (в конце концов, вызов getAddNFunction(9)(2)
точно такой же, как и вызов 9 + 2
, за исключениемфакт, что два аргумента могут быть предоставлены в очень разное время).
Так, например, вы можете захотеть вернуть некоторую сложную функцию синтаксического анализа XML относительно некоторого корневого элемента;замыкание позволяет встроить это определение корневого элемента в саму функцию, а не зависеть от того, имеют ли вызывающие абоненты доступ к нему всякий раз, когда они хотят выполнить функцию.