12

私は現在、javascript ライブラリを作成するのに忙しいです。そのライブラリでは、コンソールに何が行われるかについてのログを提供したいと考えています。

function log () {
        if ((window && typeof (window.console) === "undefined") || !enableLogging) {
            return false;
        }

        function currentTime() {
            var time = new Date();
            return time.getHours() + ':' + time.getMinutes() + ':' + time.getSeconds() + '.' + time.getMilliseconds();
        }

        var args = [];

        args.push(currentTime());

        for (var i = 1; i < arguments.length; i++) { 
            args.push(arguments[i]);
        }

        switch (arguments[0]) {
            case severity.exception:
                if (window.console.exception) {
                    window.console.exception.apply(console, args);
                } else {
                    window.console.error.apply(console, args);
                }
                break;
            case severity.error:
                window.console.error.apply(console, args);
                break;
            case severity.warning:
                window.console.warning.apply(console, args);
                break;
            case severity.information:
                window.console.log.apply(console, args);
                break;
            default:
                window.console.log.apply(console, args);
        }
        return true;
    }

上記のコードは、ログ関数を示しています。呼び出されると、少なくとも重大度、メッセージ、およびオプションでいくつかのオブジェクト (IDBTransaction、IDBDatabase などの DOM オブジェクト) を提供します。

log(severity.information, 'DB opened', db);

今私が抱えている問題は、これがメモリリークを引き起こすことです。問題は、渡したオブジェクトが console.log メソッドによってメモリに残ることです。これを回避またはクリーンアップする方法はありますか?

4

1 に答える 1

23

console.logコードの実行後に開発者ツールでオブジェクトを検査できるようにする必要があるため、渡されたオブジェクトが GC されていないことは理解できます。これは、アプリケーションをデバッグするときに必要な方法ですが、製品コードではコンソール ロギングを行うべきではないため、これをまったく問題とは呼びません。

本番環境でまだログに記録する (またはどこかに送信する) 必要がある場合は、オブジェクトを文字列化することをお勧めします

console.log(JSON.stringify(db, null, '\t'));  // '\t' to pretty print

ここでの追加のボーナスは、ロギング時にオブジェクトの状態を実際にキャプチャできることです (ただし、オブジェクト参照のロギングは1を保証ません )。

大きなオブジェクトをログに記録しようとしているので、これを行うとパフォーマンスが低下する可能性があることに注意してください。本番環境で行う場合はよく考えてください。

1 -最新の Chrome では修正されているようです

于 2012-10-21T20:38:30.553 に答える