私が書いたいくつかのJavaScriptでconsole.log()
を使用していて、Internet Explorerで_console is not defined
_のエラーがスローされました(他のブラウザーでは正常に機能していました)。
私はそれを次のように置き換えました:
if (console) console.log("...");
console
がundefined
の場合、条件はfalse
として評価されると予想されます。エルゴ、ステートメント_console.log
_は実行されず、エラーをスローすべきではありません。
代わりに、_console is not defined at character 4
_のエラーがスローされます。
これはIEバグですか?またはその「if」条件は本当に違法ですか?if (console)
が違法である場合、if (console==undefined)
は違法です。
undefined
変数をどのようにチェックするのですか?
console
itselfがまったく存在しない場合、未定義の変数にアクセスしているためエラーがスローされます。 if(abc) {}
がエラーをスローするように。
console
はwindow
にあり、window
doesは常に存在するため、これは機能するはずです。
if(window.console) ...
基本的に、存在しないpropertyへのアクセスは無料であり、エラーをスローしません(undefined
と評価され、if
条件に失敗します)。ただし、未宣言のvariableにアクセスすることは違法です。
他の答えはあなたに根本原因を与えました。ただし、console.*
への呼び出しの前にif
を使用するよりも優れたソリューションがあります。
コンソールを使用するスクリプトを含める前に、これを(一度)追加します。
//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
または任意のコンソールメソッドをどこでも問題なく呼び出すことができます。
お役に立てれば。乾杯
internet Explorerでは、ウィンドウのロード時に開発者ツールが開かれていない限り、コンソールオブジェクトは実際には定義されません。
問題を修正するには、すべてのコンソール出力をifステートメントでラップします。
if (typeof window.console !== 'undefined') {
...
}
コンソールの印刷を確認するには、開発者ツールを開いた後に各ページを更新する必要もあります。 <3 IE
これは、宣言されていない変数に関する面白いことです。 JSエンジンは、変数をwindow
のプロパティに解決しようとします。したがって、通常、foo == window.foo
。
ただし、そのプロパティが存在しない場合、エラーがスローされます。
alert(foo); // Syntax error: foo is not defined
( "fooはdeclared" imhoではありませんが、何でもかまいません。)explicitlyウィンドウのプロパティを参照すると、このエラーは発生しません。
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() {} };
Cを定義する関数への入力としてc.lengthを使用しても機能しません。また、window.consoleにメソッドを追加する必要がある場合は、配列内の項目を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);
一部のブラウザでは、dev-toolsが閉じられたときにconsole
が有効になっていません。また、コンソールが無効になっているWebViewまたはiFrameでこの問題が発生します。
これらの場合のエラーは-Uncaught ReferenceError: console is not defined
ここでの多くの回答に触発されて、私はこのユースケース用のライブラリを開発しました: https://github.com/sunnykgupta/jsLogger
機能:
log
、warn
、error
、info
などの主要なコンソール関数を処理します。@ Edgar Villegas Alvaradoanswer に触発され、メソッドを完成させ、少しシンプルにしました:
(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に入れて構文エラーを修正するように編集されました!
以下を使用して、すべての拠点をカバーしているという程度の保険を追加できます。最初にtypeof
を使用すると、undefined
エラーが回避されます。 ===
を使用すると、型の名前が実際に文字列「未定義」になることも保証されます。最後に、コンソールに出力したいものをすべてログ関数に渡すため、一貫性を確保するために、関数シグネチャにパラメーターを追加します(logMsg
を任意に選択します)。これにより、インテリセンスの正確性が維持され、JS対応IDEでの警告/エラーが回避されます。
if(!window.console || typeof console === "undefined") {
var console = { log: function (logMsg) { } };
}