Internet Explorer: ошибка "консоль не определена"
Я был с помощью console.log()
в каком-то JavaScript я написал и ошибку:console is not defined
был брошен в Internet Explorer (отлично работал в других браузерах).
Я заменил его с:
if (console) console.log("...");
если console
is undefined
, Я ожидал бы, что состояние будет оцениваться как false
. Следовательно, утверждение console.log
не будет выполнен и не должен выдавать ошибку.
вместо ошибка: console is not defined at character 4
бросается.
это IE жучок? Или это условие "если" действительно незаконно? Это кажется абсурдным, потому что если if (console)
незаконно, то if (console==undefined)
должно быть тоже незаконным.
как вы должны проверить для undefined
переменные?
9 ответов
если console
не существует, он выдает ошибку, потому что вы обращаетесь к неопределенной переменной. Прямо как if(abc) {}
выдает ошибку.
С console
проживает в window
и window
тут всегда существуют, это должно работать:
if(window.console) ...
в основном, к свойства это не существует бесплатно и не бросает ошибку (она просто оценивается в undefined
, не if
состояние). Однако, доступ к необъявленному переменная.
другие ответы дали вам первопричину.
Однако, есть лучшее решение, чем использование 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.log
или любой метод консоли везде, без проблемы.
надеюсь, что это помогает. Ура!--5-->
в internet explorer объект консоли фактически не определен, если средства разработчика не открыты во время загрузки окна.
чтобы устранить проблему, оберните все отпечатки консоли в Оператор if:
if (typeof window.console !== 'undefined') {
...
}
вам также необходимо обновить каждую страницу после открытия инструментов разработчика, чтобы увидеть отпечатки консоли.
это забавная вещь о необъявленных переменных. Движок JS пытается разрешить переменную свойству window
. Так обычно,foo == window.foo
.
но, если это свойство не существует, он выдает ошибку.
alert(foo); // Syntax error: foo is not defined
(должно быть "foo is not объявил" ИМХО, но это неважно.) Эта ошибка не возникает, когда вы явно ссылка на свойство окна:
alert(window.foo); // undefined
...или заявить, что переменная:
var foo;
alert(foo); // undefined
...или используйте его для инициализации:
foo = 1; // window.foo = 1
странно то, что typeof
оператор также предотвращает эту ошибку:
alert(typeof foo); // "undefined"
Итак, подводя итог: вы не можете использовать необъявленные переменные в выражениях, если нет свойства window
С тем же именем, или вы используете его как операнд typeof
. В вашем примере, window.console
не существует, и нет декларации var. Вот почему вы получаете ошибку.
Как насчет этого? Не пробовал, хотя
if (typeof console == "undefined" || typeof console.log == "undefined") var console = { log: function() {} };
правка @yckart это
использование c.длина в качестве входных данных для функции, которая определяет c, не будет работать. Также вы просто переназначаете элементы в массиве с помощью noop, когда вы должны добавлять методы в окно.приставка.
(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);
вы можете использовать НИЖЕ, чтобы дать дополнительную степень страхования, что у вас есть все базы покрыты. Используя typeof
во-первых, будет избегать любых undefined
ошибки. Используя ===
также гарантирует, что имя типа на самом деле является строкой "undefined". Наконец, вы захотите добавить параметр в сигнатуру функции (я выбрал logMsg
произвольно) для обеспечения согласованности, так как вы передаете все, что хотите напечатать на консоли, в функцию журнала. Это также держит вас intellisense точным и избегает любых предупреждений/ошибок в вашей JS-среде IDE.
if(!window.console || typeof console === "undefined") {
var console = { log: function (logMsg) { } };
}
вдохновленный @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 и исправить синтаксическую ошибку!
некоторые браузеры не имеют console
включено, когда dev-tools закрыт. Кроме того, возникнет эта проблема с WebViews или iFrames, где консоль отключена.
ошибка в этих случаях -Uncaught ReferenceError: console is not defined
вдохновленный многими ответами здесь, я разработал библиотеку для этого usecase:https://github.com/sunnykgupta/jsLogger
характеристики:
- он спокойно перекрывает приставка.бревно.
- заботится, если консоль недоступна (О да, вам нужно учитывать это тоже.)
- хранит все журналы (даже если они погашены) для последующего извлечения.
- обрабатывает основные функции консоли, такие как
log
,warn
,error
,info
.