function init(n) {
console.log(n);
setInterval(init.bind(this, ++n), 1000);
}
// init(0); // Works bad
function init2(n) {
setInterval(function() {
console.log(n++);
}, 1000);
}
init2(0); // Works fine

第一个是带有setInterval
的递归函数。
为什么第一个功能不能用作"期望" ? "期待"我的意思是每1秒显示n + 1
我被告知这是因为通过自我调用,呼叫越来越多,内存溢出。
这个我已经注意到了,但是我无法做出这种心理形象,能否有人向我解释更详细?我的问题是,我认为,当每1秒执行一次这个功能时,我确信这确实会发生,但不会。调用乘法,不要等待1000毫秒。
我对流程的心理形象是:
1 - Call init ()
2 - Show n and then add 1 to n
3 - With a setInterval, execute the init () function only if 1000 ms have
passed.
4- 1 second passed ..
5- We return to step 1
答案 0 :(得分:3)
init()
。该函数启动一个每秒触发一次的间隔。init()
开始另一个时间间隔。init()
。两个函数调用都开始一个新的间隔。现在共有4个时间间隔。等等,直到资源耗尽为止。
在init2()
中,这不会发生,因为间隔从不再次调用该函数,因此只有一个间隔在运行。
答案 1 :(得分:1)
如果您使用setTimeout
代替,则第一个代码段就可以了:
function init(n) {
if (n > 10) return; // 10 is enough in the example code
console.log(n);
setTimeout(init.bind(this, ++n), 1000);
}
init(0); // Works good

请参阅原始案例init()
每次调用setInterval
- 换句话说,设置每1秒重复一次的不同任务。但是你显然需要一个间隔(如第二个片段) - 只是在每个步骤继续。
答案 2 :(得分:-1)
问题是init.bind(this, ++n)
返回一个新函数,然后新函数返回一个新函数,依此类推。每秒都有一个init
函数运行。因此,每秒都会创建新副本,而这些副本又会产生更多副本。不只有一个init
自行运行。副本正在“堆积”起来。