Internet Explorer: «консоль не определена» Ошибка - PullRequest
23 голосов
/ 15 марта 2012

Я использовал console.log() в некотором JavaScript, который я написал, и в Internet Explorer возникла ошибка: console is not defined (нормально работал в других браузерах).

Я заменил его на:

if (console) console.log("...");

Если console равно undefined, я ожидаю, что условие оценивается как false.Следовательно, оператор console.log не будет выполнен и не должен выдавать ошибку.

Вместо этого выдается ошибка: console is not defined at character 4.

Это ошибка IE?Или это условие «если» действительно незаконно?Это кажется абсурдным, потому что если if (console) недопустимо, то if (console==undefined) также должно быть недопустимым.

Как вы должны проверять undefined переменные?

Ответы [ 9 ]

31 голосов
/ 25 июля 2012

Другие ответы дали вам основную причину.Однако есть лучшее решение, чем использование 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 или любой консольный метод в любом месте.

Надеюсь, это поможет.Приветствия

25 голосов
/ 15 марта 2012

Если console само по себе вообще не существует, выдается ошибка, поскольку вы получаете доступ к неопределенной переменной.Так же, как if(abc) {} выдает ошибку.

Поскольку console находится в window, а window всегда существует, это должно работать:

if(window.console) ...

По сути, доступ к несуществующему свойству 1016 * является бесплатным и не выдает ошибку (он просто оценивается как undefined, что не соответствует условию if).Однако доступ к необъявленной переменной .

запрещен.
7 голосов
/ 15 марта 2012

в Internet Explorer консольный объект на самом деле не определен, если только инструменты разработчика не открыты во время загрузки окна.

, чтобы решить вашу проблему, оберните все свои консольные отпечатки в оператор if:

if (typeof window.console !== 'undefined') {
    ...
}

Вам также необходимо обновить каждую страницу после открытия инструментов разработчика, чтобы увидеть распечатки консоли.<3 IE </p>

4 голосов
/ 16 марта 2012

Это забавная вещь с необъявленными переменными.Механизм JS пытается преобразовать переменную в свойство window.Так обычно foo == window.foo.

Но, если это свойство не существует, выдается ошибка.

alert(foo); // Syntax error: foo is not defined

(Должно быть "foo не объявлено "imho, но не важно.) Эта ошибка не возникает, когда вы явно ссылаетесь на свойство окна:

alert(window.foo); // undefined

... или объявляете эту переменную:

var foo;
alert(foo); // undefined

... или использовать его для инициализации:

foo = 1; // window.foo = 1

Странно то, что оператор typeof также предотвращает эту ошибку:

alert(typeof foo); // "undefined"

Итак, чтобы подвести итог: Вы не можете использовать необъявленные переменные в выражениях, если нет свойства window с тем же именем или вы используете его в качестве операнда typeof.В вашем примере window.console не существует, и нет объявления var.Вот почему вы получаете ошибку.

3 голосов
/ 15 марта 2012

Как насчет этого? Хотя не пробовал это

if (typeof console == "undefined" || typeof console.log == "undefined") var console = { log: function() {} };
1 голос
/ 30 октября 2013

Редактирование ответа @ 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);
0 голосов
/ 21 мая 2018

В некоторых браузерах не включен console, когда dev-tools закрыт. Кроме того, можно столкнуться с этой проблемой с WebViews или iFrames, где консоль отключена.

Ошибка в этих случаях - Uncaught ReferenceError: console is not defined

Вдохновленный многими ответами здесь, я разработал библиотеку для этого варианта использования: https://github.com/sunnykgupta/jsLogger

Особенности:

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

Вдохновленный @ Эдгар Вильегас Альварадо ответ , завершил методы и сделал его немного проще:

(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 и исправитьсинтаксическая ошибка!

0 голосов
/ 05 февраля 2013

Вы можете использовать нижеприведенную форму, чтобы получить дополнительную степень страховки, покрывающую все базы.Сначала используйте typeof, чтобы избежать ошибок undefined.Использование === также гарантирует, что имя типа на самом деле является строкой "undefined".Наконец, вы захотите добавить параметр в сигнатуру функции (я выбрал logMsg произвольно), чтобы обеспечить согласованность, поскольку вы передаете все, что вы хотите, в консоль, функции журнала.Это также обеспечивает точность ваших сведений и позволяет избежать любых предупреждений / ошибок в вашей IDE-осведомленной среде JS.

if(!window.console || typeof console === "undefined") {
  var console = { log: function (logMsg) { } };
}
...