[英]Recursion stack - Javascript
我正在Javascript中尝试这种递归操作,发现数字以错误的顺序打印出来(Desc,而我期望是Asc)。 为什么会这样,我如何可视化流程?
(function hi(x) {
if (x > 1000) {
return;
} else {
x+=1;
setTimeout(hi(x), 100000);
console.log(x);
}
})(4)
将您的代码更改为:
(function hi(x) {
if (x > 1000) {
return;
} else {
x+=1;
setTimeout(function (){hi(x);}, 100);
console.log(x);
}
})(4)
变化在这里:
function (){hi(x);}
这个 :
setTimeout(hi(x),
立即调用该功能。 你不想要那个。
您需要一个在100000 ms之后运行hi(x)
的函数 。
您虽然传递给setTimeout
的第一个参数是一个函数,但事实并非如此。
当您这样做时:
setTimeout(hi(x), 100000);
它的意思是:
hi(x)
以获得其值 100000ms之后,如果上一步的值是
eval
) 因此等于:
var ret = hi(x);
setTimeout(ret, 100000);
显然ret
不是您的函数hi
,而是它的返回值undefined
。 所以setTimout(undefined, 100000)
实际上没有任何意义-100000ms之后eval(undefined)
。
剥离掉,您的代码等于:
(function hi(x) {
if (x > 1000) {
return;
} else {
x+=1;
hi(x);
console.log(x);
}
})(4)
这是什么? 是的, 同步递归函数调用。 这就是为什么您看到控制台中的结果递减计数而不是您期望的原因。
这些解决方案除了将其包装在匿名函数中之外:
setTimeout(function () {
hi(x);
}, 100000);
另外,您也可以将额外的参数传递给setTimeout
:
setTimeout(hi, 100000, x);
延迟后传递给setTimout
参数将在调用它时传递给hi
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.