timer = window.setTimeout(function () {
//do something
window.setTimeout(arguments.callee, 1000);
}, 1000);
结果是这些代码运行良好。
但为什么它不会导致以下错误?
最大调用栈大小超出
在调试中,发现变量作用域不包括之前执行的setTimeout函数的作用域。
谁能解释这个问题?最好附带文档。
timer = window.setTimeout(function () {
//do something
window.setTimeout(arguments.callee, 1000);
}, 1000);
结果是这些代码运行良好。
但为什么它不会导致以下错误?
最大调用栈大小超出
在调试中,发现变量作用域不包括之前执行的setTimeout函数的作用域。
谁能解释这个问题?最好附带文档。
setTimeout
是异步的(它在执行回调函数之前就返回),回调函数将在新的、空的调用栈帧上执行。这就是整个目的。它永远不会溢出堆栈。
它不是递归调用,对于递归调用需要保留作用域(在非尾调用优化函数的情况下)。但这也意味着函数变成了阻塞式的,这不是你想要的。
可选地,再等待用户代理定义的时间长度。
arguments.callee
- 给它命名为:setTimeout(function foo(){ setTimeout(foo,1000);})
- Benjamin Gruenbaum