Internet Explorer: "консоль не определена" Ошибка
Я использовал console.log()
в некотором JavaScript, который я написал, и в Internet Explorer была брошена ошибка: console is not defined
(отлично работала в других браузерах).
Я заменил его на:
if (console) console.log("...");
Если console
- undefined
, я ожидал бы, что условие будет оцениваться как false
. Ergo, оператор console.log
не будет выполнен и не должен вызывать ошибку.
Вместо этого выдается ошибка: console is not defined at character 4
.
Является ли это ошибкой IE? Или это условие "если" действительно незаконно? Это кажется абсурдным, потому что если if (console)
является незаконным, то if (console==undefined)
также должен быть незаконным.
Как вы должны проверять переменные undefined
?
Ответы
Ответ 1
Если console
сам не существует вообще, он выдает ошибку, потому что вы обращаетесь к переменной undefined. Точно так же, как if(abc) {}
вызывает ошибку.
Так как console
находится в window
, а window
всегда существует, это должно работать:
if(window.console) ...
В принципе, доступ к неприменимому свойству является бесплатным и не вызывает ошибку (он просто оценивает undefined
, не выполняя условие if
). Тем не менее, незаконно получить доступ к необъявленной переменной.
Ответ 2
Другие ответы дали вам основную причину.
Однако есть лучшее решение, чем использование if
перед любым вызовом console.*
Добавьте это (один раз), прежде чем включать любой из ваших скриптов, которые используют консоль:
//Ensures there will be no 'console is undefined' errors
window.console = window.console || (function(){
var c = {}; c.log = c.warn = c.debug = c.info = c.error = c.time = c.dir = c.profile = c.clear = c.exception = c.trace = c.assert = function(s){};
return c;
})();
Это создаст консоль "псевдо", только если она не существует, поэтому ошибки "console is undefined" исчезнут, и вам не придется спрашивать, существует ли консоль каждый раз.
При этом вы просто вызываете console.log
или любой метод консоли в любом месте, без проблем.
Надеюсь, это поможет.
Приветствия
Ответ 3
в Internet explorer консольный объект фактически не определен, если ваши инструменты разработчика не открыты в момент загрузки окна.
чтобы исправить вашу проблему, заверните все свои копии консоли в инструкции if:
if (typeof window.console !== 'undefined') {
...
}
вам также нужно обновить каждую страницу после того, как вы откроете инструменты для разработчиков, чтобы увидеть отпечатки консоли. < 3 IE
Ответ 4
Это забавная вещь о необъявленных переменных. JS-движок пытается разрешить переменную свойству window
. Так обычно, foo == window.foo
.
Но если это свойство не существует, оно выдает ошибку.
alert(foo); // Syntax error: foo is not defined
(Должно быть "foo не объявлено" imho, но что бы то ни было.) Эта ошибка не возникает, когда вы явно ссылаетесь на свойство window:
alert(window.foo); // undefined
... или объявить эту переменную:
var foo;
alert(foo); // undefined
... или использовать его для инициализации:
foo = 1; // window.foo = 1
Странно, что оператор typeof
также предотвращает эту ошибку:
alert(typeof foo); // "undefined"
Итак, чтобы подвести итог: вы не можете использовать необъявленные переменные в выражениях, если не существует свойства window
с тем же именем или вы используете его как операнд typeof
. В вашем примере window.console
не существует и нет объявления var. Вот почему вы получаете сообщение об ошибке.
Ответ 5
Как насчет этого? Не пробовал, хотя
if (typeof console == "undefined" || typeof console.log == "undefined") var console = { log: function() {} };
Ответ 6
Изменить ответ @yckart
Использование c.length в качестве входа функции, которая определяет c, не будет работать. Кроме того, вы просто переназначаете элементы в массиве noop, когда вы должны добавлять методы в window.console.
(function(w){
var c = 'assert,clear,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profileEnd,table,time,timeEnd,timeStamp,trace,warn'.split(','),
noop = function () {};
w.console = w.console || (function (len) {
var ret = {};
while (len--) { ret[c[len]] = noop; }
return ret;
}(c.length));
})(window);
Ответ 7
Вы можете использовать ниже, чтобы предоставить дополнительную степень страхования, что у вас есть все основания. Использование typeof
сначала позволит избежать ошибок undefined
. Использование ===
также гарантирует, что имя типа на самом деле является строкой "undefined". Наконец, вам нужно добавить параметр в подпись функции (я выбрал logMsg
произвольно), чтобы обеспечить согласованность, поскольку вы передаете все, что хотите напечатать на консоли, функции журнала. Это также обеспечивает точность intellisense и позволяет избежать любых предупреждений/ошибок в вашей JS-среде IDE.
if(!window.console || typeof console === "undefined") {
var console = { log: function (logMsg) { } };
}
Ответ 8
Вдохновленный @Edgar Villegas Alvarado ответ, завершил методы и сделал это немного проще:
(function(w){
var c = 'assert,clear,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profileEnd,table,time,timeEnd,timeStamp,trace,warn'.split(','),
noop = function () {};
w.console = w.console || (function (len) {
var ret = {};
while (len--) { ret[c[len]] = noop; }
return ret;
}(c.length));
})(window);
Отредактировано для ввода в IIFE и исправления синтаксической ошибки!