ES6的文档中模拟了这样一个Thunk函数并给出了一个实例:
// ES5版本
var Thunk = function(fn){
return function (){
var args = Array.prototype.slice.call(arguments);
return function (callback){
args.push(callback);
return fn.apply(this, args);
}
};
};
// ES6版本
const Thunk = function(fn) {
return function (...args) {
return function (callback) {
return fn.call(this, ...args, callback);
}
};
};
// 例子:
function f(a, cb) {
cb(a);
}
const ft = Thunk(f);
ft(1)(console.log) // 1
这里以ES5版本为例(ES6同,只是写法不一样),来分析这个例子,
ft(1)(console.log)执行步骤:
1. ft(1)先执行创建一个args,args里包含参数1,执行完毕后返回一个函数,该函数参数是console.log( 即下方的T(console.log)函数 )
2. 令T = ft(1),即第二步执行T(console.log)函数,该函数将console.log与args通过push方法整合在一起,得到最终的arguments
3. 将arguments赋给最初的fn函数,立即执行fn(arguments),其中arguments 等价于 [1,console.log]
4. 执行fn(1, console.log),最终打印结果为1