高级函数-thunk

形实转换程序。JavaScript中的thunk是指一个用于调用另外一个函数的函数,没有任何参数。换句话说,用一个函数定义封装函数调用,包括需要的任何参数,来定义这个调用的执行,那么这个封装函数就是一个形实转换程序。

同步thunk

function foo(x,y) {
	return x + y;
}

function fooThunk() {
	return foo( 3, 4 );
}

// 稍后

console.log( fooThunk() );	// 7

异步thunk

function foo(x,y,cb) {
    setTimeout( function(){
        cb( x + y );
    }, 1000 );
}

function fooThunk(cb) {
    foo( 3, 4, cb );
}

// 稍后

fooThunk( function(sum){
    console.log( sum );		// 7
} );

封装thunk工具函数:

function thunkify(fn) {
	var args = [].slice.call( arguments, 1 );
	return function(cb) {
		args.push( cb );
		return fn.apply( null, args );
	};
}

var fooThunk = thunkify( foo, 3, 4 );

// 稍后

fooThunk( function(sum) {
	console.log( sum );		// 7
} );

thunk工厂,产生一个生成thunk的函数:

// thunk + factory = thunkory
function thunkify(fn) {
	return function() {
		var args = [].slice.call( arguments );
		return function(cb) {
			args.push( cb );
			return fn.apply( null, args );
		};
	};
}

// 用法
var whatIsThis = thunkify( foo );

var fooThunk = whatIsThis( 3, 4 );

// 稍后

fooThunk( function(sum) {
	console.log( sum );		// 7
} );

在程序开头构造thunkory来封装已有的API方法,并在需要thunk时可以传递和调用这些thunkory,是很有用的。两个独立的步骤保留了一个更清晰的功能分离。