thunk函數

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)
相關文章
相關標籤/搜索