1.函數參數求值的策略javascript
a.傳值策略(c語言)java
傳值策略就是在進入函數體以前將 參數計算以後 將參數的值傳入到函數體之中。 json
let x = 8 f(x + 1)//參數爲 f(9)//傳進去的值實際上爲9
b.傳名策略(Hskell語言)函數
f(x + 1)//傳進函數體的仍然爲x +1,進入函數體以前不會對其進行求值
傳名策略避免了對無用的參數的計算blog
編譯器的"傳名調用"實現,每每是將參數放到一個臨時函數之中,再將這個臨時函數傳入函數體。這個臨時函數就叫作 Thunk 函數。ip
function f(m){ return m * 2; } f(x + 5); // 等同於 var thunk = function () { return x + 5; }; function f(thunk){ return thunk() * 2; }
上面代碼中,函數 f 的參數 x + 5 被一個函數替換了。凡是用到原參數的地方,對 Thunk 函數求值便可。編譯器
這就是 Thunk 函數的定義,它是"傳名調用"的一種實現策略,用來替換某個表達式。io
2.js是傳值策略,它的thunk函數的含義爲將一個多參函數,轉化爲一個個單參函數編譯
//原函數爲 fs.readFile('path', callback) 將其轉化爲 readFile = (path) => (callback) => fs.readFile(path, callback) let readFileFunc = readFile('./1.json') //readFileFunc = (callback) => fs.readFile(path, callback)(path爲'./1.json') let callback = (err,data) => {……} readFileFunc(callback)//fs.readFile(path, callback)