Проблемы с объектом JSON в старой версии IE - PullRequest
1 голос
/ 06 октября 2011

В качестве теста, чтобы убедиться, что вызовы объекта JSON не заканчиваются в IE, я недавно добавил это в мою библиотеку js:

//Works
//if(!JSON) var JSON={};
//JSON.stringify = JSON.stringify || function(){};
//Works
//if(!window.JSON) JSON={};
//JSON.stringify = JSON.stringify || function(){};
//Does not work
//if(!JSON) JSON={};
//JSON.stringify = JSON.stringify || function(){};
//Best of both!
if(!window.JSON) var JSON={};
JSON.stringify = JSON.stringify || function(){};

Когда я говорю «не работает», я имею в видуне работает в IE7 и выдает ошибку "JSON Blah Blah Blah".Почему указание window.JSON не выдает ошибку?И почему бы не указать window.JSON, но с помощью переменной JSON не выдать ошибку?Это просто глупые вещи в IE, о которых мне не стоит беспокоиться, или это опасно и может стать проблемой для других браузеров?

Обратите внимание, что то же самое относится и к "console".

1 Ответ

3 голосов
/ 06 октября 2011

При доступе к неопределенной глобальной переменной всегда выдается.Доступ к неопределенному свойству объекта всегда будет возвращать undefined.Тот факт, что window является псевдонимом для global, не меняет здесь правил, при доступе к неопределенному члену window будет возвращено undefined.

Что касается того, почему второй пример не выдает, потому что все var s подняты во вложенную область независимо от того, где они появляются, и до того, как какой-либо код будет выполнен в этой области.Это означает, что переменная JSON определена, даже если var не выполняется, она будет содержать undefined.var делает две вещи, создает переменную в области видимости и, необязательно, инициализирует переменную.Создание переменной поднимается в верхнюю часть области видимости, назначение выполняется там, где она появляется.Все переменные содержат undefined, пока им не будет присвоено значение.Если задание не выполнено, оно останется undefined.Дубликаты var в той же области игнорируются.Это означает, что если JSON уже находится в области видимости, var игнорируется.

Это не глупая вещь IE, все реализации JavaScript, соответствующие ES5, должны следовать правилам, которые я изложил выше.

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