Javascript 如何捕获私有变量
在运行此代码时(在nodejs中),“Count”对于较大的“Count”值运行负值。 谁是罪魁祸首,“伯爵”还是“锁链”? 编写'flood'函数的正确方法是什么,以便它在setTimeout()之后安排下一次调用Javascript 如何捕获私有变量,javascript,node.js,closures,Javascript,Node.js,Closures,在运行此代码时(在nodejs中),“Count”对于较大的“Count”值运行负值。 谁是罪魁祸首,“伯爵”还是“锁链”? 编写'flood'函数的正确方法是什么,以便它在setTimeout()之后安排下一次调用 flood=函数(计数){ 链=函数(){ --计数; console.log(“计数”+计数) 如果(计数>0){ 设置超时(链,1); } }; 链(); } runit=函数(计数,par){ 控制台日志(“rUn:”+计数+”,“+PAR”) 对于(var i=0;i<PA
flood=函数(计数){
链=函数(){
--计数;
console.log(“计数”+计数)
如果(计数>0){
设置超时(链,1);
}
};
链();
}
runit=函数(计数,par){
控制台日志(“rUn:”+计数+”,“+PAR”)
对于(var i=0;i<PAR;i++){
洪水(计数)
}
}
runit(3,4)
塔克斯
更新:
如果我调用chain()而不是setTimeout(chain,1),则计数永远不会为负。
chain
是一个全局值,因为您没有使用var关键字。这使得您的代码的行为与之类似,因为runit(3,4)
4次:
flood(2); // Prints "Count 2" and calls setTimeout
然后发生第一轮异步回调。在该轮中,链被传递,而它引用了正确的函数,因此您将使用正确的链进行另一轮,并打印“Count 1”四次,但在这轮中,当您调用setTimout
时,您将从最近的flood调用传递链,因此现在您有4个异步调用该单链,您将得到:
"Count 0"
"Count -1"
"Count -2"
"Count -3"
使用var
声明它,您的问题将得到解决:
var chain = function() { ...
chain
是一个全局变量,因为您没有使用var关键字。这使得您的代码的行为与之类似,因为runit(3,4)
4次:
flood(2); // Prints "Count 2" and calls setTimeout
然后发生第一轮异步回调。在该轮中,链被传递,而它引用了正确的函数,因此您将使用正确的链进行另一轮,并打印“Count 1”四次,但在这轮中,当您调用setTimout
时,您将从最近的flood调用传递链,因此现在您有4个异步调用该单链,您将得到:
"Count 0"
"Count -1"
"Count -2"
"Count -3"
使用var
声明它,您的问题将得到解决:
var chain = function() { ...
哎哟被喝咖啡的习惯所苦。。太多了.哎哟。。被喝咖啡的习惯所苦。。很多。