1.函数参数求值的策略
a.传值策略(c语言)
传值策略就是在进入函数体之前将 参数计算之后 将参数的值传入到函数体之中。
let x = 8
f(x + 1)//参数为
f(9)//传进去的值实际上为9
b.传名策略(Hskell语言)
f(x + 1)//传进函数体的仍然为x +1,进入函数体之前不会对其进行求值
传名策略避免了对无用的参数的计算
编译器的"传名调用"实现,往往是将参数放到一个临时函数之中,再将这个临时函数传入函数体。这个临时函数就叫做 Thunk 函数。
function f(m){
return m * 2;
}
f(x + 5);
// 等同于
var thunk = function () {
return x + 5;
};
function f(thunk){
return thunk() * 2;
}
上面代码中,函数 f 的参数 x + 5 被一个函数替换了。凡是用到原参数的地方,对 Thunk 函数求值即可。
这就是 Thunk 函数的定义,它是"传名调用"的一种实现策略,用来替换某个表达式。
2.js是传值策略,它的thunk函数的含义为将一个多参函数,转化为一个个单参函数
//原函数为
fs.readFile('path', callback)
将其转化为
readFile = (path) => (callback) => fs.readFile(path, callback)
let readFileFunc = readFile('./1.json')
//readFileFunc = (callback) => fs.readFile(path, callback)(path为'./1.json')
let callback = (err,data) => {……}
readFileFunc(callback)//fs.readFile(path, callback)