【问题标题】:how to capture private variable如何捕获私有变量
【发布时间】:2013-07-16 09:07:05
【问题描述】:

在运行此代码时(在 nodejs 中),对于较大的 'count' 值,'Count' 运行负数。 谁是罪魁祸首,“伯爵”还是“链条”? 编写“洪水”函数的正确方法是什么,以便它在 setTimeout() 之后安排下一次调用。

flood =  function( count) {    
    chain = function() {
        --count;
        console.log("Count " + count)
        if( count > 0 ) {
            setTimeout(chain, 1);
        }
    };
    chain();
}


runit = function (count,par) {
    console.log("RUNIT: " + count + " , " + par )
    for( var i = 0 ; i < par ; i ++ ) {
        flood(count)
    }
}

runit(3,4)

感谢

更新: 如果我调用 chain() 而不是 setTimeout(chain,1),则 Count 永远不会变为负数。

【问题讨论】:

    标签: javascript node.js closures


    【解决方案1】:

    chain 是一个全局变量,因为您没有使用 var 关键字。对于runit(3, 4),这会使您的代码表现得像这样。

    4 次:

    flood(2); // Prints "Count 2" and calls setTimeout
    

    然后第一轮异步回调发生。在该轮链中,它引用了正确的函数,因此您将使用正确的链进行另一轮并打印“计数 1”四次,但是在这一轮中,当您调用 setTimout 时,您从最最近调用 Flood,所以现在你有 4 个异步调用,单个链,你会得到:

    "Count 0"
    "Count -1"
    "Count -2"
    "Count -3"
    

    使用var 声明它,您的问题将得到解决:

    var chain = function() { ...
    

    【讨论】:

    • 哎哟..被coffeescript习惯咬了..非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多