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

характеристики:

  1. он спокойно перекрывает приставка.бревно.
  2. заботится, если консоль недоступна (О да, вам нужно учитывать это тоже.)
  3. хранит все журналы (даже если они погашены) для последующего извлечения.
  4. обрабатывает основные функции консоли, такие как log, warn, error, info.