如何捕获私有变量

时间:2013-07-17 17:13:25

标签: javascript node.js closures

运行此代码(在nodejs中)时,'Count'对'count'的大值运行为负。 谁是罪魁祸首,'数'或'链'? 编写'flood'函数的正确方法是什么,以便在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永远不会变为负数。

1 个答案:

答案 0 :(得分:1)

chain是全局的,因为您没有使用var关键字。这使得您的代码表现得像runit(3, 4)

4次:

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

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

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

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

var chain = function() { ...