function thunkify(fn){
// assert('function' == typeof fn, 'function required');
return function(){
var args = new Array(arguments.length);
var ctx = this;
for(var i = 0; i < args.length; ++i) {
args[i] = arguments[i];
}
return function(done){
var called;
args.push(function(){
if (called) return;
called = true;
done.apply(null, arguments);
});
try {
fn.apply(ctx, args);
} catch (err) {
done(err);
}
}
}
};
function f(a, b, callback){
var sum = a + b;
callback(sum);
callback(sum);
}
var ft = thunkify(f);
ft(1, 2)(console.log);
函数执行过程:
1、执行 thunkify(f),将执行结果称为闭包1,指向ft。
2、执行ft(1,2),将{1,2}参数传给ft函数,执行结果称为闭包2,。
3、执行ft(1, 2)(console.log),将console.log这个回调函数传给闭包2。
4、 args.push(function(){
if (called) return;
called = true;
done.apply(null, arguments);
});
这段函数将回调函数包裹了一层判断函数,当第一次执行 callback(sum);时,called变量变为true,执行done.apply(null, arguments);。当第二次执行 callback(sum);时,called变量已经是ture不再执行done.apply(null, arguments)。所以只会执行一次callback。