20200320

@xiaojingzhao

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;
}

More