我无法动态地声明函数。我试着问这个问题,所以它更通用,但我真的不知道我在这种情况下做了什么,并继续回到我的代码。
我有一个包含日志级别的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');
答案 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);
}
}