Преимущества закрытия JavaScript? - PullRequest
11 голосов
/ 10 июня 2011

Какова основная цель Закрытия в JS. Используется ли он только для публичных и приватных переменных? или есть что-то еще, что я пропустил. Я пытаюсь понять замыкание и действительно хочу знать, каковы основные преимущества его использования.

Ответы [ 3 ]

11 голосов
/ 10 июня 2011

Замыкания связаны с тем, как определяется область применения 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 являются лексическими а не динамически ограниченный. это означает, что они работают в области которые они определены, а не сфера из которого они выполнены. Когда функция определена, текущая область цепочка сохраняется и становится частью внутреннее состояние функции. "

Таким образом, очевидным преимуществом является то, что вы можете доставлять любой объект (функции, объекты и т. Д.) Вместе с цепочкой областей действия настолько, насколько это необходимо. Это также может рассматриваться как риск, потому что ваши приложения могут легко потреблять много памяти, если вы не будете осторожны.

5 голосов
/ 10 июня 2011

Я думаю, что лучшая фраза для суммирования замыканий будет:

Инкапсуляция данных

С закрытием функции вы можете хранить данные в отдельной области и делиться ими только при необходимости.

Если вы хотите эмулировать private static variables, вы можете определить класс внутри функции и определить private static vars в замыкании:

(function () {
    var foo;
    foo = 0;
    function MyClass() {
        foo += 1;
    }
    MyClass.prototype = {
        howMany: function () {
            return foo;
        }
    };
    window.MyClass = MyClass;
}());
2 голосов
/ 10 июня 2011

Замыкания необходимы в javascript из-за того, что большинство API, которым требуются функции обратного вызова (например, функция «onclick»), не предоставляют другие механизмы для отправки параметров этим функциям обратного вызова (или для явной установки «this»). указатель). Вместо этого вам нужно использовать замыкания, чтобы позволить обратному вызову обращаться к переменным в «родительской» функции.

Лично я желаю, чтобы они не были необходимы, так как они могут быть трудными для понимания, создавать трудно читаемый код (не всегда понятно, что именно находится в области видимости) и создавать странные ошибки. Вместо этого я хотел бы, чтобы был стандарт для обратных вызовов, который позволял бы вам отправлять параметры и т. Д. Но я согласен, что я в меньшинстве в этом представлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...