参考: ES标准入门 page361
问题:X+5 何时求值,有两种方式

  1. var x = 1
  2. function f(m) {
  3. return m*2
  4. }
  5. f(x+5)

1. 传值调用(call by value)

进入函数体前,就计算出x+5的值,然后将其传入函数f(C/JavaScript语言采用的方式)
缺点: 如果函数体内部,没有用到该参数,造成性能损失。

2. 传名调用 (call by name)

直接将表达式 x+5传入函数体,只有用到的时候才求值。

2.1 实现

将参数放到一个临时函数中,再将这个函数传入函数体。————临时函数被称之 Thunk 函数

  1. var thunk = function(){
  2. return x + 5
  3. }
  4. funtion f(thunk) {
  5. return thunk() * 2
  6. }

3. JS语言中thunk函数定义

js是传值调用,故在js语言环境中,thunk函数含义有所不同。
其替换的不是表达式,而是多参数,将其替换成一个只接受回调函数作为参数的单参数函数。

  1. // 正常版本(多参数版本)
  2. fs.readFile(filename,callback)
  3. // thunk版本(单参数)
  4. var Thunk = function(filename){
  5. return function(callback) {
  6. return fs.readFile(filename,callback)
  7. }
  8. }
  9. var readFileThunk = Thunk(fileName)
  10. readFileThunk(callback)

thunk函数在generator函数实现异步操作流程管理非常有用