Подтвердить что ты не робот

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?

4b9b3361

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