首先了解一下javascript里面的Thunk函數的含義:將多參數函數,替換成一個只接受回調函數作為參數的單參數函數
// 一個具體的例子// 正常版本的readFile(多參數函數)
fs.readFile(filename, callback);// Thunk版本的readFile(單參數版本)
var Thunk = function (fileName) {return function (callback) {return fs.readFile(fileName, callback);};
};// 調用方法如下:
var readFileThunk = Thunk(fileName);
readFileThunk(callback);// 可以看見,原本傳遞2個參數(filename, callback)通過Thunk函數變為1個參數(callback);
下面是ES5、ES6中Thunk函數的簡單實現,理解它有助于我們使用它.
// ES5版本
var Thunk = function(fn) {return function () {// 函數參數存放在arguments里面.通過Thunk(fn)傳入方法var args = Array.prototype.splice.call(arguments);// 再次執行Thunk函數的實例,將回調的方法傳遞進來.return function (callback) {args.push(callback);return fn.apply(this, args);}};
};// ES6版本
// const作用于對象,代表Thunk的在物理內存中的位置不變.
const Thunk = function (fn) {// ...是擴展運算符,用來接收 var a = Thunk(fn)的參數return function (...args) {return function (callback) {return fn.call(this, ...args, callback);}};
};// ES6實現明顯比ES5簡單,且更易理解...
總結:Thunk函數的使用方法如下(以讀取文件操作為例),
// 首先將方法(fs.readFile)傳進Thunk函數
var readFileThunk = Thunk(fs.readFile);// 使用readFileThunk函數,傳入需要讀取的文件名(fileA),和回調函數(callback),注意括號的位置
readFileThunk(fileA)(callback);
下面看一個具體的實例:
function f(a, cb) {cb(a);
}
const ft = Thunk(f);
ft(1)(console.log) // 1
參考《ES6標準入門》P362~P364