Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:动态声明函数的正确方法_Javascript_Node.js - Fatal编程技术网

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

Javascript:动态声明函数的正确方法,javascript,node.js,Javascript,Node.js,我在动态声明函数方面遇到了麻烦。我试图问这个问题,所以它更一般,但我真的不知道在这种情况下我在做什么,并不断回到我的代码 我有一个json对象,它包含日志级别(如下面的代码所示),对于每个日志级别,我需要创建一个函数,以便调用,例如:log.info(“我的日志消息”) 我遇到的问题是,当我调用log.info()时,我不知道是否调用了“info”作为我所知道的全部log.error(),因为所有这些函数都包含相同的动态代码,我不知道如何检测调用此函数的函数 我希望这是有道理的。我是为Node.

我在动态声明函数方面遇到了麻烦。我试图问这个问题,所以它更一般,但我真的不知道在这种情况下我在做什么,并不断回到我的代码

我有一个json对象,它包含日志级别(如下面的代码所示),对于每个日志级别,我需要创建一个函数,以便调用,例如:log.info(“我的日志消息”)

我遇到的问题是,当我调用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');

这与最近的问题非常相似:。大家,不要在循环中创建闭包

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

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

非常感谢你拯救了我的理智,我被困在这个问题上好几个小时了:)
Object.keys(levels).forEach(function (severity) {
  this[severity] = function (message) {
    console.log(severity, message);
  });
}, this);