“蹦床”方法的区别

Difference between "trampoline" methods

本文关键字:区别 方法 蹦床      更新时间:2023-09-26

我最近开始学习JS,这是我第一次涉足函数式语言领域。

functional-javascript-workshop npm 模块中进行"蹦床"练习时,我自己的解决方案和官方解决方案之间存在有趣的差异。两者都工作得很好,但我不知道它们之间的实际区别是什么。我非常了解我自己的解决方案,但不完全理解为什么另一个解决方案也有效。

我的解决方案

function repeat(op, num) {
  var _repeat = function() {
    if (num <= 0) return;
    op();
    return repeat(op, --num);
  };
  return _repeat;
}
function trampoline(f) {
  while (f instanceof Function) {
    f = f();
  }
  return f;
}
module.exports = function(op, num) {
  return trampoline(repeat(op, num));
};

官方解决方案

function repeat(operation, num) {
  return function() {
    if (num <= 0) return
    operation()
    return repeat(operation, --num)
  }
}
function trampoline(fn) {
  while(fn && typeof fn === 'function') {
    fn = fn()
  }
}
module.exports = function(operation, num) {
  trampoline(function() {
    return repeat(operation, num)
  })
}

具体来说,我对最后一部分感到好奇 - 为什么官方解决方案创建一个匿名函数而不仅仅是传递repeat

其实没有理由。

除了蹦床会发出所有调用,而在您的版本中,repeat的第一次调用是在它之外完成的。这可能被认为是更干净的,并且当trampoline更复杂时可能会产生实际差异(例如,将所有执行包装在 try-catch 中)。

看看蹦床:

   function trampoline(fn) {
      while(fn && typeof fn === 'function') {
        fn = fn()
      }
    }

请注意,只要fn是它调用的函数,它就会不断迭代。

所以理论上你可以有尽可能多的嵌套函数并获得相同的结果:

module.exports = function(operation, num) {
  trampoline(function() {
    return function() {
        return function() {
           return repeat(operation, num);
        };
    };
  });
};

演示:http://jsbin.com/yixaliyoye/1/edit

官方解决方案比您的解决方案多了一个冗余步骤。没有真正的原因,除了原作者可能认为它看起来更具可读性。