【问题标题】:Nodejs console overload scope issueNodejs控制台重载范围问题
【发布时间】:2013-03-14 17:28:37
【问题描述】:

我正在尝试用 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 不想拘泥于自己的范围。

【问题讨论】:

    标签: javascript node.js winston


    【解决方案1】:

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

    如果您希望 'z' 保持不变,请将其作为参数传递给匿名函数:

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

    【讨论】:

    • 我对这个概念有点困惑。能否请您再扩展一点。
    猜你喜欢
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多