Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 区别于;蹦床“;方法_Javascript_Node.js_Trampolines - Fatal编程技术网

Javascript 区别于;蹦床“;方法

Javascript 区别于;蹦床“;方法,javascript,node.js,trampolines,Javascript,Node.js,Trampolines,我最近开始学习JS,这是我第一次涉足函数式语言领域 在functional javascript workshopnpm模块中进行“蹦床”练习,在我自己的解决方案和官方解决方案之间发现了一个有趣的差异。两者都很好,但我不知道它们之间的实际区别到底是什么。我非常理解自己的解决方案,但不完全理解为什么另一个也能起作用 我的解决方案 function repeat(op, num) { var _repeat = function() { if (num <= 0) return;

我最近开始学习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)
  })
}
函数重复(op,num){
var_repeat=函数(){

如果(num看一下蹦床:

   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);
        };
    };
  });
};
演示:


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

没有真正的理由


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

我认为代码没有任何区别,我注意到的唯一一点是,在正式解决方案中,您可以立即知道使用函数调用trampoline,在您的解决方案中,必须检查返回的内容。另外,请注意,使用正式解决方案时要小心,避免javascript中出现分号如果你不知道这在“引擎盖下”是有效的。嘿,乔尔,我有个问题要问你。我挂断了这个练习。我看不出“fn&&typeof fn==”function”何时或是否会是真的。有点困惑。