javascript - 为什么setTimeout调用的函数没有调用栈限制?

标签 javascript browser settimeout

timer =  window.setTimeout(function () {
    //do something
    window.setTimeout(arguments.callee, 1000);
}, 1000);

结果是这些代码运行良好。

但为什么不会导致下面的错误?

Maximum Call Stack Size Exceeded

调试时发现变量作用域不包括之前执行的“setTimeout函数”的作用域

谁能解释一下?

最好有文档。

最佳答案

setTimeout 是异步的(它在执行回调之前返回),回调将在一个新的空堆栈帧上执行。这就是整个目的。它永远不会溢出堆栈。

这不是递归调用,需要保留其作用域(在非 tail-call 优化函数的情况下)。但这也意味着函数变成了阻塞,这不是您想要的。

关于javascript - 为什么setTimeout调用的函数没有调用栈限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24631041/

相关文章:

javascript - 如何在 ES6 或 Javascript 中的 settimeout 函数之后触发不受我们控制的函数?

hibernate - 在 hibernate 中设置 session 或事务的超时

javascript - 尽管我使用 # idname 选择了所有 ID,但为什么所有 ID 都没有更改?

html - 镜像 HTML 页面打印

html - 解析器(例如 HTML)如何工作?

javascript - 间隔较大的 settimeout 函数会消耗大量 CPU 资源

javascript - 这个有效语法如何?

javascript定义一个全局常量

javascript - 将 Summernote 与 Meteor 结合使用(发现 Meteor)

javascript - 如何检查浏览器的在线状态