编辑:我的这个问题已经证明是非常恶劣的。我仍然相信,特别是通过评论,它可能提供一些思想的食物,但如果有足够的票数让它关闭,我会理解。
在一篇关于如何通过在JavaScript中模拟call / cc来解除调用堆栈的方法的一篇非常有趣的论文的研究中(What's the difference between a continuation and a callback?)我遇到了一个似乎是彻底改进的方式用于使JS函数调用异步。
最受欢迎的方式是setTimeout(fun, 0)
。这种构造从当前执行线程中调用fun
,并允许事件队列中的其他作业继续执行。但是,当轮到它时,fun
在所有情况下都会保持其整个调用堆栈。
但是,如果像上面提到的论文那样,代码更改为setTimeout.bind(null, fun, 0)
,我们正在编写延续传递样式(没有return
指令要记住) ,然后fun
的调用堆栈清除并返回深度1。
可以看到所有这些工作in an example。在Chrome,FF,IE,Opera中验证。
示例HTML页面非常简单,可以在打开开发人员工具的情况下在浏览器中下载和运行。第18行和第42行有两个暂停指令,您可以在其中观察由两个setTimeout
调用维护的调用堆栈之间的差异。
问题是:setTimeout.bind()
如何与普通setTimeout
调用完全不同?有人可以说明发生了什么吗?