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次间隔在
init2()
中,这种情况不会发生,因为该间隔不再调用该函数,因此只有一个间隔在运行。问题是init.bind(this,++n)
返回一个新函数,然后该新函数返回一个新函数,依此类推。并非只有一个init
函数每秒运行一次。因此,每秒钟都会有新的拷贝被创建,而它们又会生成更多的拷贝。不是只有一个init
自己运行。副本正在“堆叠”起来。您的第一个函数不是递归函数setInterval
不在当前调用堆栈上调用其参数。您知道setTimeout
和setInterval
之间的区别吗?