Замыкания связаны с тем, как определяется область применения javascript. Другими словами, из-за того, что дизайнеры javascript сделали выбор области видимости (то есть лексическую область видимости), возможны замыкания.
Преимущество замыканий в javascript заключается в том, что оно позволяет вам связать переменную с контекстом выполнения.
var closedIn = {};
var f = function(){
closedIn.blah = 'blah'; // closedIn was just "closed in" because I used in the function, but it was defined outside the function.
}
в этом примере у вас есть обычный литерал объекта с именем closedIn
. Доступ к нему осуществляется в функции. Из-за этого javascript знает, что он должен приносить closedIn
везде, где он приносит функцию f
, поэтому он доступен для f
.
Ключевое слово this
сложно. this
всегда является ссылкой на область выполнения. Вы можете захватить this
одного контекста для использования в другом контексте следующим образом:
var that = this;
var f = function(){
that.somethingOnThat();
// `this` means the scope f, `that` means whatever 'this' was when defined outside of the function
}
Этот прием может быть очень полезен, если вы кодируете объектно-ориентированный JavaScript и хотите, чтобы обратный вызов имел доступ к некоторой внешней области видимости.
Цитировать из книги Javascript:
"Функции в JavaScript являются лексическими
а не динамически ограниченный. это
означает, что они работают в области
которые они определены, а не сфера
из которого они выполнены. Когда
функция определена, текущая область
цепочка сохраняется и становится частью
внутреннее состояние функции. "
Таким образом, очевидным преимуществом является то, что вы можете доставлять любой объект (функции, объекты и т. Д.) Вместе с цепочкой областей действия настолько, насколько это необходимо. Это также может рассматриваться как риск, потому что ваши приложения могут легко потреблять много памяти, если вы не будете осторожны.