最近在用js处理任务的时候发生了栈溢出问题, 原来是递归调用函数的次数太多, 函数栈没有来得及释放导致, 用 setTimeout 调用递归函数解决了我的问题, 但是还有一些不明之处, 请大家指教!
func1 = function(i) {
i += 1;
console.log(i);
if (i > 1000000) {
return;
}
return func1(i);
};
func1(0);
func2 = function(i) {
i += 1;
console.log(i);
if (i > 1000000) {
return;
}
return setTimeout((function() {
return func2(i);
}), 0);
};
func2(0);
我的疑惑就是 setTimeout 中的函数调用时, 之前的函数堆栈有没有被释放呢? 如果有的话变量 i 是怎么传进去的; 如果没有的话, 这段代码为什么不会栈溢出。
1
xieguanglei 2014-10-20 17:25:38 +08:00 2
前一个,直到栈溢出,第一次func1函数调用都没有结束。
后一个 return setTimeout((function() { return func2(i); }), 0); 这一句之后,这一次func2函数就结束了。 函数堆栈释放,变量i没有释放,具体请Google下 [闭包] 。 |
2
revir OP |
3
revir OP @xieguanglei
刚刚测试发现内存占用确实会越来越大, gotcha! |
4
revir OP 神奇的闭包原来是创建在堆上的, 难怪不会栈溢出!
|
5
chemzqm 2014-10-20 18:04:34 +08:00
我的理解是 setTimeout 实际上把函数丢到下一次轮询的栈队列去了,i是值传递,如果是对象还有可能造成内存泄露
|
6
jakwings 2014-10-20 18:41:35 +08:00
|