为什么意外结果显示结果?

时间:2018-01-30 16:36:18

标签: javascript recursion



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

3 个答案:

答案 0 :(得分:3)

  1. 手动调用init()。该函数启动一个每秒触发一次的间隔。
  2. 一秒钟之后,该时间间隔首次触发并调用init()开始另一个时间间隔。
  3. 两秒钟后(从开始算起)两个间隔触发并调用init()。两个函数调用都开始一个新的间隔。现在共有4个时间间隔。
  4. 三秒钟后,4个间隔触发,每个间隔开始一个新的间隔。现在共有8个时间间隔。
  5. 等等,直到资源耗尽为止。

    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自行运行。副本正在“堆积”起来。