在CPS计算期间使用bind清除调用堆栈

时间:2015-11-01 21:10:46

标签: javascript bind settimeout continuation-passing

编辑:我的这个问题已经证明是非常恶劣的。我仍然相信,特别是通过评论,它可能提供一些思想的食物,但如果有足够的票数让它关闭,我会理解。

在一篇关于如何通过在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调用完全不同?有人可以说明发生了什么吗?

0 个答案:

没有答案