Nodejs控制台超载范围问题

时间:2013-03-14 09:02:12

标签: javascript node.js winston

我试图用Winston覆盖Nodejs中的控制台。

for (var z in loggerSettings) {
    console[z] = (function () {
        var i = z + ''
          , _backup = console[z];
        return function () {
            var utfs = arguments.length >= 2 ? util.format.apply(util, arguments) : arguments[0]
              , coldex = 0;
            if (true) logger[i == 'log' ? 'info' : i](utfs);
            if (loggerSettings[i].console){
                if ((coldex = utfs.indexOf(']') + 1) <= MAX_TAG_LENGTH) 
                    _backup(utfs.substring(0, coldex)[i]['inverse'] + utfs.substring(coldex));
                else _backup(utfs);
            }
        }
    })();
}

这里var z只是一个基本的console.log,console.info,console.warn方法。问题是z正在改变每个匿名函数。解决这个问题有点挑战,但是z的范围似乎发生了变化,变量z并没有完全坚持循环的每次迭代的常量值。 Z不想坚持其范围。

1 个答案:

答案 0 :(得分:1)

Javascript具有函数范围,但没有块作用域,这意味着控制台函数中对z的每次引用都将使用z的最后一个值。

如果你想要'z',请将它作为参数传递给匿名函数:

for (var z in loggerSettings) {
  (function(z) {
    console[z] = (function () {...});
  )(z);
};