参数的求值策略
var x = 1;
function f(m) {
return m * 2
}
f(x + 5)
- 传值调用(call by value):进入函数体之前计算参数 x + 5
- 传名调用(call by name):直接将 x + 5 传入函数体
利弊:传值调用比较简单,但是参数求值的时候,实际上还没用到这个参数,可能造成性能损失
Thunk函数
编译器的“传名调用”实现,往往是将参数放到一个临时函数之中,再将这个临时函数传入函数体。这个临时函数就叫做 Thunk 函数。
thunk是传名调用的一种实现策略,用来替换某个表达式
function f(m) {
return m * 2;
}
f(x + 5);
// 等同于
var thunk = function () {
return x + 5;
};
function f(thunk) {
return thunk() * 2;
}
JavaScript中的Thunk函数
JavaScript 语言是传值调用,它的 Thunk 函数含义有所不同。在 JavaScript 语言中,Thunk 函数替换的不是表达式,而是多参数函数,将其替换成一个只接受回调函数作为参数的单参数函数。
// 正常版本的readFile(多参数版本)
f