web-dev-qa-db-ja.com

Internet Explorer:「コンソールが定義されていません」エラー

私が書いたいくつかのJavaScriptでconsole.log()を使用していて、Internet Explorerで_console is not defined_のエラーがスローされました(他のブラウザーでは正常に機能していました)。

私はそれを次のように置き換えました:

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

consoleundefinedの場合、条件はfalseとして評価されると予想されます。エルゴ、ステートメント_console.log_は実行されず、エラーをスローすべきではありません。

代わりに、_console is not defined at character 4_のエラーがスローされます。

これはIEバグですか?またはその「if」条件は本当に違法ですか?if (console)が違法である場合、if (console==undefined)は違法です。

undefined変数をどのようにチェックするのですか?

23
matteo

consoleitselfがまったく存在しない場合、未定義の変数にアクセスしているためエラーがスローされます。 if(abc) {}がエラーをスローするように。

consolewindowにあり、windowdoesは常に存在するため、これは機能するはずです。

if(window.console) ...

基本的に、存在しないpropertyへのアクセスは無料であり、エラーをスローしません(undefinedと評価され、if条件に失敗します)。ただし、未宣言のvariableにアクセスすることは違法です。

25
pimvdb

他の答えはあなたに根本原因を与えました。ただし、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

7
jbabey

これは、宣言されていない変数に関する面白いことです。 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宣言もありません。そのため、エラーが発生します。

4

これはどう?まだ試していません

if (typeof console == "undefined" || typeof console.log == "undefined") var console = { log: function() {} };
3
Chetter Hummin

@ yckart's answer の編集

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);
1
Sam Carrington

一部のブラウザでは、dev-toolsが閉じられたときにconsoleが有効になっていません。また、コンソールが無効になっているWebViewまたはiFrameでこの問題が発生します。

これらの場合のエラーは-Uncaught ReferenceError: console is not defined

ここでの多くの回答に触発されて、私はこのユースケース用のライブラリを開発しました: https://github.com/sunnykgupta/jsLogger

機能:

  1. Console.logを安全に上書きします。
  2. コンソールが使用できない場合は注意してください(そうです、それも考慮に入れる必要があります)。
  3. 後で取得するために、すべてのログが(抑制されていても)保存されます。
  4. logwarnerrorinfoなどの主要なコンソール関数を処理します。
0
Sunny R Gupta

@ 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に入れて構文エラーを修正するように編集されました!

0
yckart

以下を使用して、すべての拠点をカバーしているという程度の保険を追加できます。最初にtypeofを使用すると、undefinedエラーが回避されます。 ===を使用すると、型の名前が実際に文字列「未定義」になることも保証されます。最後に、コンソールに出力したいものをすべてログ関数に渡すため、一貫性を確保するために、関数シグネチャにパラメーターを追加します(logMsgを任意に選択します)。これにより、インテリセンスの正確性が維持され、JS対応IDEでの警告/エラーが回避されます。

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