Изучение области видимости переменных JavaScript и создания объектов - PullRequest
0 голосов
/ 18 декабря 2009
var foo = (function() {
    var proxy = {},
        warning = false;

    proxy.warn = function(msg) {
        if (!warning) {
            warning = true;
            alert(msg);
        }
        return this; //For the purpose of method chaining we return proxy object.
    }

    function func() {
        alert(warning); //This is a private function relative to foo.
    }

    return proxy;
}());

foo.warn(); //will alert
foo.warn(); //will not alert since warning has been set to true

Я не совсем понимаю, что такое создание экземпляров, поскольку новое ключевое слово не используется. Есть ли здесь утечка с точки зрения срока действия предупреждения?

Спасибо.

Ответы [ 4 ]

2 голосов
/ 18 декабря 2009

Ну a живут в верхней функции закрытия function() {....

foo содержит прокси-объект, который вы возвращаете, это означает, что все, кто не находится в этом прокси-объекте, является частным и недоступно из foo. Если вы хотите получить значение a, вы можете добавить новую функцию, возвращающую a =>

proxy.getValueOfA=function(){return a}

тогда вы можете позвонить foo.getValueOfA()

В качестве замечания:

var proxy={}

является краткой формой var proxy=new Object(), так что есть инстанцирование.

1 голос
/ 18 декабря 2009

это

    return proxy;
}());

должно быть это

    return proxy;
})();

и это

function() {
     alert('test');
     return 42;
}();

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

(function() {
     alert('test');
     return 42;
})();

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

var foo = (function() {
    var proxy = {}, // private
    proxy.warn = function(msg) {
    ...
    return proxy; // publicly accessible

это то же самое, что и

var foo = { warn: function(){ /* code */ } };
1 голос
/ 18 декабря 2009

И proxy.method, и func имеют доступ к a через замыкание свойство . Для получения дополнительной информации о области действия и объектах, посмотрите эту статью, которая недавно появилась: Краткое, исполняемое руководство по объектам JavaScript, переменным, функциям и прототипам

Код, который вы опубликовали, соответствует так называемому « шаблону модуля » и становится очень популярным способом определения объектов в JavaScript, поскольку он позволяет легко создавать частные переменные и методы (с помощью преимущество свойства замыкания, как упоминалось ранее).

1 голос
/ 18 декабря 2009

Этот ответ на другой вопрос действительно помог мне расширить мое понимание того, как работают объекты JavaScript:

Псевдоним функции JavaScript не работает

Что касается вашего фрагмента кода, давайте разберем его. Начните с рассмотрения структуры высокого уровня: var foo = ( exrpession );. Вы также можете легко сказать: var foo = expression;, но IIRC скобки необходимы для обработки специфической особенности IE.

Теперь, в этом случае выражение является анонимной функцией. Javascript прекрасно подходит для определения функции без имени. Только не ожидайте, что позвоните, пока не сохраните ссылку где-нибудь. Вы также можете вызвать анонимную функцию сразу после объявления, например:

function() {
     alert('test');
     return 42;
}();

Это должно выглядеть подозрительно похоже на базовую структуру, используемую для выражения из вашего фрагмента кода. Надеюсь, вы легко можете увидеть, что 42 из моего образца может быть так же легко объектом.

Таким образом, остается вопрос: зачем вам это делать? Помните, что в javascript функции также являются объектами. Будучи хорошим учеником ООП, вы, вероятно, хотели бы сделать некоторые объекты ваших объектов приватными. Тем не менее, javascript не имеет ничего встроенного для поддержки этого. К счастью, бывает, что если вы вернете объект из этой внутренней функции, у него будет доступ к другим переменным, определенным в этой функции, но внешний код не будет иметь никакого доступа к ним. Таким образом, вы, по сути, создали объект с закрытыми членами.

...