调用返回的函数

时间:2017-10-03 14:32:15

标签: javascript function

所以我试图在Javascript中编写一个常规的memoizing函数,使用this作为我的参考资料。我按照指示实施了它:



public class A
{
    public int Id {get; set;}
    public abstract string Type { get; }
}
public class B
{
    public override string Type => "value";
}




但是对于我的生活,我不记得调用memoized函数的正确语法。我该怎么做呢?我如何概括这一点,以便它被记忆的斐波纳契函数总是被称为而不是原始函数斐波那契?

1 个答案:

答案 0 :(得分:3)

你几乎就在那里;您只需要在创建memoized函数时修复语法。执行function memoFib =而不是var memoFib =(或者如果ES2015是一个选项,const将优于var)。并且大概你也希望将递归调用到memoized版本中,所以我也更新了它们。在下面的代码中,我可能看起来很奇怪,我在早于var memoFib行的行上引用memoFib,但javascript允许hoisting



function memoize(func) {
  var memo = {};
  var slice = Array.prototype.slice;

  return function() {
    var args = slice.call(arguments);

    if (args in memo)
      return memo[args]
    else
      return (memo[args] = func.apply(this, args));
  }
}

function fibonacci(n) {
  if (n === 0 || n === 1)
    return n;
  else
    return memoFib(n - 1) + memoFib(n - 2);
}

var memoFib = memoize(fibonacci);

console.log("Fibonacci of 6 is " + memoFib(6));




如果你想绝对确定没有人可以调用非原型版本,那么你可以将其隐藏在IIFE内:

const fibonacci = (function () {
  function unmemoizedVersion(n) {
    if (n === 0 || n === 1)
      return n;
    else
      return fibonacci(n - 1) + fibonacci(n - 2);
  }
  return memoize(unmemoizedVersion);
})();