1.函数参数求值的策略javascript
a.传值策略(c语言)java
传值策略就是在进入函数体以前将 参数计算以后 将参数的值传入到函数体之中。 json
let x = 8 f(x + 1)//参数为 f(9)//传进去的值实际上为9
b.传名策略(Hskell语言)函数
f(x + 1)//传进函数体的仍然为x +1,进入函数体以前不会对其进行求值
传名策略避免了对无用的参数的计算blog
编译器的"传名调用"实现,每每是将参数放到一个临时函数之中,再将这个临时函数传入函数体。这个临时函数就叫作 Thunk 函数。ip
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 函数的定义,它是"传名调用"的一种实现策略,用来替换某个表达式。io
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)