20200320
Plan
- 你不知道的 js 中卷 -- 生成器
Notes
实行转换程序(thunk)
js 中的 thunk - 一个调用另一个函数的函数:
编译器的"传名调用"实现,往往是将参数放到一个临时函数之中,再将这个临时函数传入函数体。这个临时函数就叫做 Thunk 函数。
JavaScript 语言是传值调用,它的 Thunk 函数含义有所不同。在 JavaScript 语言中,Thunk 函数替换的不是表达式,而是多参数函数,将其替换成单参数的版本,且只接受回调函数作为参数。
// 正常版本的readFile(多参数版本)
fs.readFile(fileName, callback);
// Thunk版本的readFile(单参数版本)
var readFileThunk = Thunk(fileName);
readFileThunk(callback);
var Thunk = function(fileName) {
return function(callback) {
return fs.readFile(fileName, callback);
};
};
thunkify
function foo(x, t, cb) {
setTimeiut(() => {
cb(x + y);
});
}
function thunkify(fn) {
var args = [].slice.call(arguements, 1);
return function(cb) {
args.push(cb);
return fn.apply(null, args);
};
}
var fooThunk = thunkify(foo, 3, 4);
// 调用
fooThunk(sum => console.log(sum));
一道面试题: 和 thunkify 没什么关系,就是突然联想到。
// sum(1) // 1
// sum(1)(2) // 3
// sum(1)(2)(3) // 6
function sum(value) {
let result = 0;
result += value;
function add(val) {
result += val;
return add;
}
add.toString = function() {
return result;
};
return add;
}