Json2: почему «var JSON» в глобальной области видимости не перекрывает глобальный объект JSON? - PullRequest
2 голосов
/ 22 апреля 2011

Вверху json2.js (строка 160 после комментариев: https://github.com/douglascrockford/JSON-js/blob/master/json2.js), - следующий код:

var JSON;
if (!JSON) {
    JSON = {};
}

Как правило, объявление var что-то устанавливает «что-то» в неопределенное значение:

var something = {};

(function(){
    var something;

    console.log(something); // logs undefined
})();

Обычно я бы достиг этой цели, используя:

var JSON = JSON || {};

Так что же с глобальным объектом JSON, который позволяет писать "var JSON", чтобы он не был установлен как неопределенный?

И с какой стати кто-то вроде Крокфорда продвигал технику, которая в любой другой ситуации НЕ работала бы так?

1 Ответ

2 голосов
/ 22 апреля 2011

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

var a = 2;
var a;
console.log(a) // 2

В данном конкретном случае

var JSON;
if (!JSON) {
   JSON = {};
}

и

var JSON = JSON || {};

в значительной степени эквивалентны.Это просто вопрос стилевых предпочтений.

Теперь, если бы он поместил его в самозаполняющуюся анонимную функцию, локальный JSON был бы установлен в неопределенное значение.

Если вы спрашиваете почему он это делает, потому что он не хочет перезаписывать нативный объект JSON, если он существует, но я думаю, что вы уже знали это.

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