我想避免我的某个项目的冗余代码,即simple logger。这个记录器需要* .alert,* .notice等函数。我还决定为它们分配别名(.alert = .al等)。
这导致了多个类似的功能,只有一个数字和名称相同。
Module.protoype.emergency = Module.prototype.em = function () {
this.applyLogLevel(' + (i+1) + ', arguments);
}
为了减少代码库的冗余,我创建了这个“creator-function”:
// create logging functions
var prototypeNames = [
['emergency', 'emer', 'mrgc', 'em'],
['alert', 'aler', 'alrt', 'al'],
['critical', 'crit', 'crtc', 'cr'],
['error', 'erro', 'rror', 'er'],
['warning', 'warn', 'wrng', 'wa'],
['notice', 'noti', 'notc', 'no'],
['info', 'in'],
['debug', 'debu', 'dbug', 'de']
];
for (var i = 0; i < prototypeNames.length; i++) {
for (var j = 0; j < prototypeNames[i].length; j++) {
Module.prototype[prototypeNames[i][j]] = Module.prototype.Namespace.prototype[prototypeNames[i][j]] = new Function ('this.applyLogLevel(' + (i+1) + ', arguments);');
}
}
现在我的Javascript linter告诉我new Function()
是eval()
的一种形式。有没有其他/更好的方法来解决这个问题?
答案 0 :(得分:2)
你可以替换
new Function ('this.applyLogLevel(' + (i+1) + ', arguments);');
通过
(function(level) {
return function() {
this.applyLogLevel(level, arguments);
}
})(i+1);
答案 1 :(得分:1)
我想这就是你要找的东西:
var prototypeNames = [
['emergency', 'emer', 'mrgc', 'em'],
['alert', 'aler', 'alrt', 'al'],
['critical', 'crit', 'crtc', 'cr'],
['error', 'erro', 'rror', 'er'],
['warning', 'warn', 'wrng', 'wa'],
['notice', 'noti', 'notc', 'no'],
['info', 'in'],
['debug', 'debu', 'dbug', 'de']
];
var Logger = {
applyLogLevel: function(level, args) {
document.write('log ' + level + ' ' + args[0] + '<br>');
}
};
prototypeNames.forEach(function(names, level) {
var fn = function() {
this.applyLogLevel(level, arguments);
};
names.forEach(function(n) {
Logger[n] = fn;
});
});
Logger.emergency('oops')
Logger.warn('take care')
Logger.dbug('stop')