Вы сказали, что IE говорит, что console
не определено в строке
if (console) { ... // Error if `console` is not defined anywhere
Это совершенно правильно. console
не является гарантированным встроенным объектом в браузерах, хотя многие браузеры предоставляют его. Вы, вероятно, хотите
if (typeof console !== "undefined") { ...
... вместо этого. Там мы не принимаем значение , мы просто проверяем, существует ли оно.
Это область JavaScript, которая может немного запутать, но в основном, если вы попытаетесь принять значение неквалифицированной ссылки, которая действительно не объявлена где-либо , например,
if (foo) { ...
... это ошибка. Причина, по которой это может сбить с толку, заключается в том, что вы можете назначить на foo
в точно такой же ситуации, и это будет допустимо (это будет Ужас неявных глобалов , но допустимо ). Точно так же вы можете с радостью принять значение свойства объекта, которое никогда не было определено:
var obj = {};
if (obj.foo) { ... // Not an error, we just don't go into the body of the `if`
... потому что это не безоговорочная ссылка. Но с неквалифицированными ссылками это ошибка.
Так почему console
неквалифицирован на IE8 и IE9, у обоих console.log
и так далее? Потому что IE8 и IE9 не имеют console
[или console.log
] , если у вас не открыты инструменты разработчика . Удивительно, но факт. Неправильно, но верно. :-) Открытие инструментов разработчика, которые по сути являются плагином для IE8 и IE9, добавляет объект console
на лету. (Подробнее об этом в этот другой вопрос (и ответ) здесь о переполнении стека.)