Делает это с любой переменной.Объявление его в той же области снова не приведет к сбросу значения переменной.Я предполагаю, что это результат поднятия переменной (все объявления перемещаются в начало функции).
var a = 2;
var a;
console.log(a) // 2
В данном конкретном случае
var JSON;
if (!JSON) {
JSON = {};
}
и
var JSON = JSON || {};
в значительной степени эквивалентны.Это просто вопрос стилевых предпочтений.
Теперь, если бы он поместил его в самозаполняющуюся анонимную функцию, локальный JSON был бы установлен в неопределенное значение.
Если вы спрашиваете почему он это делает, потому что он не хочет перезаписывать нативный объект JSON, если он существует, но я думаю, что вы уже знали это.