thunk是一个很早就出现了的函数,主要的作用是实现传名调用,先简单介绍一下thunk的作用
例如:
var x=1;
function f(n){
return n*2;
}
f(x+1);
传值调用等同于f(2);
传名调用等同于(1+1)*2
看起来似乎没有什么区别
但是如果函数改成这个样子
var x=1;
function f(n){
return 1;
}
f(x+1);
这时候传值调用会先计算x+1=2然后把结果传进去,这样就经过了计算x+1但是最后并没有使用到这个参数
传名调用就直接传入x+1然后返回1,并没有进行x+1的计算,省下了计算的时间
thunk就是为了实现传名调用
由于本文是讲js中的thunk函数,所以就科普到这里,接下来进入正题
js中的thunk函数
JavaScript语言是传值调用,但是它的thunk函数含义有所不同,在js中,thunk函数替换的不是表达式,而是把多参数函数转换成单参数的版本,且只接受回调函数作为参数
// 正常版本的readFile(多参数版本)
fs.readFile(fileName, callback);
// Thunk版本的readFile(单参数版本)
var readFileThunk = Thunk(fileName);
readFileThunk(callback);
var Thunk = function (fileName){
return function (callback){
return fs.readFile(fileName, callback);
};
};
上面代码中,fs 模块的 readFile 方法是一个多参数函数,两个参数分别为文件名和回调函数。经过转换器处理,它变成了一个单参数函数,只接受回调函数作为参数。这个单参数版本,就叫做 Thunk 函数。
任何函数,只要参数有回调函数,就能写成 Thunk 函数的形式。下面是一个简单的 Thunk 函数转换器。
var Thunk = function(fn){
return function (){
var args = Array.prototype.slice.call(arguments);
return function (callback){
args.push(callback);
return fn.apply(this, args);
}
};
};
使用上面的转换器,生成 fs.readFile 的 Thunk 函数。
var readFileThunk = Thunk(fs.readFile);
readFileThunk(fileA)(callback);
网友评论