Я был с помощью 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—>
31
автор: Edgar Villegas Alvarado
в 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. Вот почему вы получаете ошибку.
4
автор: user123444555621
Как насчет этого? Не пробовал, хотя
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
.
As shown in this post logging to the console can be very useful when writing JavaScript code. Unfortunately, the JavaScript console is not evenly supported by all browsers. You first have browsers which don’t know it at all (like IE8) and will throw the error which I use as the title of this post. And then even two browsers which do have a console object do not all implement the same functions.
Here’s a short overview of what’s supported by which browser (note that if you do not have the latest version of a specific browser, this particular version may not support all listed functions):
Function | Firefox | Chrome | Internet Explorer | Safari | Opera |
---|---|---|---|---|---|
assert | X | X | X | ||
clear | X | X | |||
count | X | X | X | X | X |
debug | X | X | X | X | X |
dir | X | X | X | X | |
dirxml | X | X | X | X | |
error | X | X | X | X | |
_exception | X | ||||
group | X | X | X | X | X |
groupCollapsed | X | X | X | X | X |
groupEnd | X | X | X | X | X |
info | X | X | X | X | |
log | X | X | X | X | |
markTimeline | X | ||||
profile | X | X | X | ||
profileEnd | X | X | X | ||
table | X | ||||
time | X | X | X | X | X |
timeEnd | X | X | X | X | X |
timeline | X | ||||
timelineEnd | X | ||||
timeStamp | X | ||||
trace | X | X | X | X | |
warn | X | X | X | X |
So even though there are quite a few functions supported by all browsers, you should still check whether the console exists and whether the particular function you want to use exists. But adding before each call to a console function a check for the console and for the function quickly becomes a pain.
A way to work around it is to:
- Create a dummy console object if console is not defined
- Create dummy functions for all functions not supported by the console object in this particular browser
The dummy console object is created by this code:
if (!window.console) {
window.console = {};
}
So simple, if the global console variable doesn’t exist, create one as an empty object. Now we’ve got either a real console object or a dummy object, we got rid of the error message saying that console is undefined. But we’ll still get errors when our code calls undefined functions. So let’s go through all functions and for each of them create a dummy function if missing:
(function() {
var funcList = ["assert", "clear", "count",
"debug", "dir", "dirxml", "error",
"_exception", "group", "groupCollapsed",
"groupEnd", "info", "log", "markTimeline",
"profile", "profileEnd", "table", "time",
"timeEnd", "timeline", "timelineEnd",
"timeStamp", "trace", "warn"];
var funcName;
for (var i=0; i < funcList .length; i++) {
funcName = funcList [i];
if (!window.console[funcName]) {
window.console[funcName] = function() {};
}
}
})()
Here a few explanations how this works. First wrapping it all in (function() { … })() is used to scope the variables we define in there, so that we do not pollute the global scope.
Then we define an array containing all known console functions and iterate through them. For each function, we check whether the console object (the real one or the dummy one) have such a function defined. If not, we assign an empty function. This is done by using the fact that functions of an object are just special properties of the object and that object properties are indexed.
So, using this, you will get rid of all errors related to the console being undefined or console functions being undefined, but of course since we add empty implementations, using these empty implementations will still have no effect.
Of course, instead of using empty implementations you could log the calls to console functions somewhere (e.g. an array) so that you can access it. If I ever need it, I might actually write some code for it and update this post.
Welcome to the Treehouse Community
The Treehouse Community is a meeting place for developers, designers, and programmers of all backgrounds and skill levels to get support. Collaborate here on code errors or bugs that you need feedback on, or asking for an extra set of eyes on your latest project. Join thousands of Treehouse students and alumni in the community today. (Note: Only Treehouse students can comment or ask questions, but non-students are welcome to browse our conversations.)
Looking to learn something new?
Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and a supportive community. Start your free trial today.
Posted by Barbara Robertson
I’m trying to use myscript.js within a basic website («Programming.html») that is in the same directory. In the console, «Uncaught ReferenceError Console is not defined» is the message I get.
Below is the source code for myscript.js, and Programming.html, respectively — please let me know if I need to format either differently to allow others to see it.Thanks!
»’Console.log(«Hello from myscript.js»);»’
»'<!DOCTYPE HTML>
<html lang=»en»>
<head>
<title>Javascript Practice</title>
<style> html { background: #FAFAFA; font-family: sans-serif; } </style> <script src="myscript.js"></script>
</head>
<body>
<h1>Introduction to Programming</h1>
<h2>Using Javascript</h2>
</body>
</html>»’
2 Answers
miguelcastro2 July 29, 2014 9:49pm
Javascript is case sensitive. The proper command should look like:
console.log(«Hello from myscript.js»);
Barbara Robertson July 29, 2014 9:54pm
Posted by at 8:50pm on October 13, 2008.
If you have recently changed your Firefox configurations (and upgraded to Firebug 1.2) then you may have experienced some difficulties with console.log throwing the following error:
ReferenceError: console is not defined
It turns out that this is by design. If you want to make use of the console object that Firebug offers, you need to do so with a call to window.loadFirebugConsole() first.
A little bit of testing, and the following code can be safely put in your javascript source to enable use of the Firebug console object safely (without breaking other browsers).
if (window['loadFirebugConsole']) { window.loadFirebugConsole(); } else { if (!window['console']) { window.console = {}; window.console.info = alert; window.console.log = alert; window.console.warn = alert; window.console.error = alert; } }
Whilst you are at it, why not check out some of the other nifty commands available on the Firebug console object at the Get Firebug website.
Tags: JavaScript
This entry is filed under the following categories: JavaScript.
You can follow any responses to this entry through the RSS 2.0 feed.
Both comments and pings are currently closed.
There is one response to this post.
Skip to content
Testing if a function or object is defined can sometimes cause as many errors as not doing so. What to do?
When developing JavaScript using either Firebug in Firefox or Chrome’s built-in console you will probably at some point be using console.log either for debugging messages or for exception information.
However, when you come to run this code in Internet Explorer, it throws an exception “console is undefined”:
[code lang=”javascript”]
try {
… // code throwing error
} catch (e) {
console.log(e); // throws script error «console is undefined»
}
[/code]
“A-ha” you think; “easily solved will just test if its defined before use”. However things are not so straight forward:
[code lang=”javascript”]
try {
… // code throwing error
} catch (e) {
if (console && console.log) // throws script error «console is undefined»
console.log(e);
}
[/code]
Even though now you are testing to see if it exists before use, you still get:
While this would normally work for attributes of objects, globally scoped variables work differently. Luckily, all variables in global scope will be declared as attributes on the global window variable. This enables you to test for existence on the window.
Here we’ve wrapped the test up in a LogException function to ease changing of logging methodologies:
[code lang=”javascript”]
function LogException(e) {
if (window.console // check for window.console not console
&& window.console.log) window.console.log(e);
// Other logging here
}
try {
… // code throwing error
} catch (e) {
LogException(e); // works fine
}
[/code]
Note: Its isn’t exclusive to Internet Explorer, it just most visible there; so checking existence of globally scoped functions and variables against window rather than just by name is good practice!
Здравствуйте.
Сегодня случилась такая хня с лисой, как можно исправить?
Ничего нового на лису не ставили вчера и сегодня (никакие дополнения, скрипты и т.д)
С утра включаю комп, включаю лису, захожу на сайт Вконтакте, чтобы послушать музыку.
Тут в firefox вылазеет сообщение слева:
Сразу после этого (если еще раз нажать на иконку воспроизведения музыки)
происходит «крах адоб флэш» :
После чего лиса намертво зависает.
Я уже пробовала переустановить его, отключала все дополнения, запускалась в автономной режиме и т.д. — не помогает.
Сразу после запуска лисы каждый раз происходит одно и тоже 1)зависает примерно на 3 минуты, 2)отвисает, 3)выдает JavaScript error, 4)выдает крах флэш плеера, 5)намертво виснет.
Это происходит только на сайте Вконтакте (и подобных сайтах, где можно запустить что-то типо музыки, видео и т.д)
При этом все остальные сайты очень сильно тупят, даже гугл открывается минут 5.
Что можно сделать? Помогите пожалуйста.
Информация по браузу:
скрытый текст
Сведения о приложении
Имя
Firefox
Версия
3.6.18
Папка профиля
Открыть его папку
Установленные плагины
about:plugins
Конфигурация сборки
about:buildconfig
Расширения
Имя
Версия
Включено
ID
Adblock Plus
1.3.1
true
{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}
Download Master Plugin
1.4.1
true
dmpluginff@westbyte.com
Download Master Remote Download
1.3
true
dmremote@westbyte.com
Download Master Toolbar
1.5.0
true
dmbarff@westbyte.com
DownloadHelper
4.9.3
false
{b9db16a4-6edc-47ec-a1f4-b86292ed211d}
Greasemonkey
0.9.5
true
{e4a8a97b-f2ed-450b-b12d-ee082ba24781}
ICQ Toolbar
1.1.9
false
{800b5000-a755-47e1-992b-48a1c1357f07}
Multirow Bookmarks Toolbar
5.0.1
false
{FBF6D7FB-F305-4445-BB3D-FEF66579A033}
NoScript
2.0.5.1
true
{73a6fe31-595d-460b-a920-fcc0f8843232}
WebMoney Advisor
0.99.6
false
{3AFFD7F7-FD3D-4C9D-8F83-03296A1A8840}
WebMoney Advisor
1.0.16
false
{3095DD7A-4815-42db-88C9-FE267B33C4EC}
QipAuthorizer
1.1
false
{32a1fd71-835e-4b11-8e54-886fda0b4c89}
Flashblock
1.5.14.2
false
{3d7eb24f-2740-49df-8937-200b1cc08f8a}
Спутник @Mail.Ru
2.5.0.90
false
{37964A3C-4EE8-47b1-8321-34DE2C39BA4D}
Firefox Synchronisation Extension
7.3.4.74
false
{A27F3FEF-1113-4cfb-A032-8E12D7D8EE70}
Java Console
6.0.24
true
{CAFEEFAC-0016-0000-0024-ABCDEFFEDCBA}
Поиск по AG.ru
1.1
false
search@ag.ru
VKontakte.ru MP3 Музыка Качалка
1.10
true
ffvkontaktemusic@chupakabr.ru
Rambler-Ассистент для Firefox
2.1.7
false
rambler_toolbar@rambler.ru
Kaspersky Virtual Keyboard
11.0.2.579
true
virtualKeyboard@kaspersky.ru
Kaspersky URL Advisor
11.0.2.579
true
linkfilter@kaspersky.ru
Anti-Banner
11.0.2.579
true
KavAntiBanner@Kaspersky.ru
Изменённые настройки
Имя
Значение
accessibility.typeaheadfind.flashBar
0
browser.history_expire_days.mirror
180
browser.places.importBookmarksHTML
false
browser.places.smartBookmarksVersion
2
browser.startup.homepage
http://google.ru/
browser.startup.homepage_override.buildID
20110615151330
browser.startup.homepage_override.mstone
rv:1.9.2.18
extensions.lastAppVersion
3.6.18
font.minimum-size.x-cyrillic
9
font.name.serif.x-cyrillic
Arial
font.size.fixed.x-cyrillic
16
general.useragent.extra.MRA
MRA 5.6 (build 03403)
general.useragent.extra.sputnik
sputnik 2.5.0.90
keyword.URL
http://go.mail.ru/search?utf8in=1&fr=fftbUFix&q=
network.cookie.prefsMigrated
true
places.history.expiration.transient_current_max_pages
128821
places.last_vacuum
1305373159
privacy.cpd.formdata
false
privacy.cpd.sessions
false
privacy.sanitize.migrateFx3Prefs
true
privacy.sanitize.timeSpan
0
security.warn_viewing_mixed
false