Javascript:动态声明函数的正确方法

时间:2012-02-22 18:04:42

标签: javascript node.js

我无法动态地声明函数。我试着问这个问题,所以它更通用,但我真的不知道我在这种情况下做了什么,并继续回到我的代码。

我有一个包含日志级别的json对象(如下面的代码所示),对于每个日志级别,我需要创建一个函数,以便我可以调用,例如:log.info('my log message'); < / p>

我遇到的问题是当我调用log.info()时,我无法弄清楚是否已经调用了'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');

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

这与最近的问题非常相似:Creating closures within a for loop - am I doing this right?。人们,不要在循环中创建闭包!

  for (var severity in levels) {
    if (levels.hasOwnProperty(severity)) {
      this[severity] = createLogger(severity);
    }
  }

  function createLogger(severity) {
      return function(message) {
        console.log(severity, message);
      }
   }