接上一篇《听君一席话,如听一席话,解释解释“惰性求值”~》,有掘友问:“我懂惰性求值的意思了,但是在 JS 中如何实现 thunk 的呢?”
JS 不像 Haskell,其自身从语言设计层面不支持惰性求值,但是可以通过语法去 模拟实现 这一特性;
想一想,我们可以用什么来 JS 语法来模拟这一“延迟计算”的特性?
没思路的话,看前篇这一句:
在《Haskell趣学指南》中,thunk 被翻译成 保证;
在《Haskell 函数式编程入门》,thunk 被解释为:
thunk 意为形实替换程序(有时候也称为延迟计算,suspended computation)。它指的是在计算的过程中,一些函数的参数或者一些结果通过一段程序来代表,这被称为 thunk。可以简单地把 thunk 看做是一个未求得完全结果的表达式与求得该表达式结果所需要的环境变量组成的函数,这个表达式与环境变量形成了一个无参数的闭包(parameterless closure),所以 thunk 中有求得这个表达式所需要的所有信息,只是在不需要的时候不求而已。
那意思是用 Promise 模拟吗?
事实上,不行!
Promise
一旦执行,它就开始执行了,你只知道是在 Pending
,但不知道是刚开始执行,或者是快执行完了,还是其它哪个执行阶段;获取 Promise
的时候,内部的异步任务就已经启动了,执行无法中途取消(这也是 Promise 的弊端之一:);
代码