参考: ES标准入门 page361
问题:X+5 何时求值,有两种方式
var x = 1
function f(m) {
return m*2
}
f(x+5)
1. 传值调用(call by value)
进入函数体前,就计算出x+5的值,然后将其传入函数f(C/JavaScript语言采用的方式)
缺点: 如果函数体内部,没有用到该参数,造成性能损失。
2. 传名调用 (call by name)
2.1 实现
将参数放到一个临时函数中,再将这个函数传入函数体。————临时函数被称之 Thunk 函数
var thunk = function(){
return x + 5
}
funtion f(thunk) {
return thunk() * 2
}
3. JS语言中thunk函数定义
js是传值调用,故在js语言环境中,thunk函数含义有所不同。
其替换的不是表达式,而是多参数,将其替换成一个只接受回调函数作为参数的单参数函数。
// 正常版本(多参数版本)
fs.readFile(filename,callback)
// thunk版本(单参数)
var Thunk = function(filename){
return function(callback) {
return fs.readFile(filename,callback)
}
}
var readFileThunk = Thunk(fileName)
readFileThunk(callback)
thunk函数在generator函数实现异步操作流程管理非常有用