var что-то = что-тоElse.obj = что-тоElse.obj || {} - для чего это используется? - PullRequest
3 голосов
/ 06 декабря 2010

Извините за странный заголовок ... не знаю, как еще узнать о такой языковой функции.

Я читал о шаблонах модулей , когда натолкнулся на этот пример, когда наткнулся на эту строку кода. Это происходит в закрытии примера шаблона модуля для поддержания приватного состояния разных файлов при «свободном расширении» модуля.

РЕДАКТИРОВАТЬ - включен код модуля

var MODULE = (function (my) { 
    var _private = my._private = my._private || {}, 
        _seal = my._seal = my._seal || function () { 
            delete my._private; 
            delete my._seal; 
            delete my._unseal; 
        }, 
        _unseal = my._unseal = my._unseal || function () { 
            my._private = _private; 
            my._seal = _seal; 
            my._unseal = _unseal; 
        }; 

    // permanent access to _private, _seal, and _unseal 

    return my; 
}(MODULE || {}));

Я пытался разбить его, но он не складывается.

Я начал смотреть на это справа налево. Теперь я видел канал var someVar = something || somethingElse и могу предположить, что если что-то не установлено (false, null и т. Д.), Оно оценивает это как логическое выражение и устанавливает другое значение подтверждения) .

Вот где я заблудился. Я могу только предположить, что цель установки my._private - установить пустой объект, если он не существует ... но это всего лишь гипотеза.

Какова цель установки my._private здесь?

Ответы [ 3 ]

2 голосов
/ 06 декабря 2010

Помните, что каждое утверждение в Javascript оценивается как значение, даже присвоение (которое оценивается как присвоенное значение).

foo = bar = 3;

совпадает с

foo = (bar = 3);

что совпадает с

bar = 3;
foo = 3;

В вашей ситуации my._private устанавливается на {}, если в настоящее время это значение Falsey, а затем это значение также присваивается локальной переменной _private

0 голосов
/ 06 декабря 2010

Они используют его где-нибудь еще в модуле? Если нет, то здесь действительно нет цели. Это могло быть выполнено как var _private = my._private || {};

0 голосов
/ 06 декабря 2010

Ваша гипотеза верна:

var _private = my._private = my._private || {};

Если существует my._private, он присваивает ее новой переменной _private.

Если это , а не там он устанавливает my._private для нового пустого объекта и устанавливает новую переменную _private для той же ссылки.


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

...