2012-02-22 13 views
2

関数を動的に宣言するのが難しいです。私はこの質問をより一般的なものにしたかったのですが、実際に私がこの場合に何をしているのかわからず、私のコードに戻ってきました。Javascript:関数を動的に宣言する正しい方法

ログレベル(以下のコードに見られるように)を含むjsonオブジェクトがあり、各ログレベルに対して関数を作成する必要があります。たとえば、log.info( 'my log message');

log.info()を呼び出すときに発生する問題は、これらの関数にはすべてlog.error()が呼び出されていることがわかっているため、「情報」が呼び出されたことがわかりません同じ動的コードと私はこれを呼び出す関数を検出する方法を知らない。

私はそれが理にかなっていると思います。これまでNode.js用にこれを書いていますので、これまでのコードは以下の通りです。私は、問題の機能がどこにあるのか、どこにログレベルを表示するのかというコメントを持っています。

exports.logger = function() { 

    // Syslog severity levels 
    var levels = { 
    emerg: { "code": 0 }, 
    alert: { "code": 1 }, 
    crit: { "code": 2 }, 
    error: { "code": 3 }, 
    warning: { "code": 4 }, 
    notice: { "code": 5 }, 
    info: { "code": 6 }, 
    debug: { "code": 7 } 
    }; 

    // Loop through each severity level 
    for (var severity in levels) { 
    // Ensure we're not iterating over a prototype 
    if (levels.hasOwnProperty(severity)) { 
     // Declare function 
     this[severity] = function(message) { 
     // Here's the problem: I have no idea what called this function. 
     console.log('Log severity level here:', message); 
     };  
    } 
    } 
} 

これは私がそれを呼び出す方法です:

var logger = require('log.js'); 
var log = new (logger.logger)(
    // settings removed for example 
); 
log.info('test'); 

答えて

4
Object.keys(levels).forEach(function (severity) { 
    this[severity] = function (message) { 
    console.log(severity, message); 
    }); 
}, this); 
+0

私の正気を保存するための本当にありがとうございましたが、時間のためにこれに貼り付けられた:) –

関連する問題