Javascript 为什么会出现意想不到的结果?

Javascript 为什么会出现意想不到的结果?,javascript,recursion,Javascript,Recursion,函数初始化(n){ 控制台日志(n); setInterval(init.bind(this,++n),1000); } //init(0);//效果不好 函数init2(n){ setInterval(函数(){ console.log(n++); }, 1000); } init2(0);//工作正常如果改用设置超时,则第一个代码段正常: 函数初始化(n){ 如果(n>10)return;//10在示例代码中就足够了 控制台日志(n); setTimeout(init.bind(this+

函数初始化(n){
控制台日志(n);
setInterval(init.bind(this,++n),1000);
}
//init(0);//效果不好
函数init2(n){
setInterval(函数(){
console.log(n++);
}, 1000);
}

init2(0);//工作正常
如果改用
设置超时
,则第一个代码段正常:

函数初始化(n){
如果(n>10)return;//10在示例代码中就足够了
控制台日志(n);
setTimeout(init.bind(this++n),1000);
}
init(0);//工作正常
  • 手动调用
    init()
    。该函数启动一个间隔,该间隔每秒触发一次
  • 一秒钟后,间隔触发第一次并调用
    init()
    ,这将启动另一个间隔
  • 两秒钟后(从开始算起),两个间隔都会触发并调用
    init()
    。两个函数调用都会启动一个新的间隔。现在总共有4次间隔
  • 三秒钟后,4个间隔触发,每个间隔开始一个新的间隔。现在总共有8次间隔
  • 等等,直到资源耗尽


    init2()
    中,这种情况不会发生,因为该间隔不再调用该函数,因此只有一个间隔在运行。

    问题是
    init.bind(this,++n)
    返回一个新函数,然后该新函数返回一个新函数,依此类推。并非只有一个
    init
    函数每秒运行一次。因此,每秒钟都会有新的拷贝被创建,而它们又会生成更多的拷贝。不是只有一个
    init
    自己运行。副本正在“堆叠”起来。

    您的第一个函数不是递归函数
    setInterval
    不在当前调用堆栈上调用其参数。您知道
    setTimeout
    setInterval
    之间的区别吗?