关于 lazy evaluation,首先要明白两个概念:call by name 和 call by value:
// Evaluates with call-by-name strategy
1 function callByName (a, b) {
2 if (a === 1) {
3 return 10
4 }
5 return a + b
6 }
// Evaluates with call-by-value strategy
1 function callByValue (a, b) {
2 if (a === 1) {
3 return 10
4 }
5 return a + b
6 }
两个函数在形式上没有什么区别,只是在运行时采取了不同的策略或态度,前者是 lazy,后者是 eager;
> callByName (1, 2 + 3)
> a === 1
> return 10
> callByValue(1, 2 + 3)
> callByValue(1, 5)
> a === 1
> return 10
使用 lazy evaluation,只用当真正需要读取这个变量或 expression 的时候,才会对其进行运算或 evaluate,也就是字面意义上的 call by need。
实现 lazy evaluation 有很多方法,但其核心概念则是 functional programming。即我们把所有的 variable 写成函数的形式,这样的函数通常被称为 thunk: