最近在用js处理任务的时候发生了栈溢出问题, 原来是递归调用函数的次数太多, 函数栈没有来得及释放导致, 用 setTimeout 调用递归函数解决了我的问题, 但是还有一些不明之处, 请大家指教!
- 下面这个函数明显会导致栈溢出, 用node执行到 17000 多次的时候就报: RangeError: Maximum call stack size exceeded.
func1 = function(i) {
i += 1;
console.log(i);
if (i > 1000000) {
return;
}
return func1(i);
};
func1(0);
- 但是改成用 setTimeout 调用就不会。
func2 = function(i) {
i += 1;
console.log(i);
if (i > 1000000) {
return;
}
return setTimeout((function() {
return func2(i);
}), 0);
};
func2(0);
我的疑惑就是 setTimeout 中的函数调用时, 之前的函数堆栈有没有被释放呢? 如果有的话变量 i 是怎么传进去的; 如果没有的话, 这段代码为什么不会栈溢出。