Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.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 - Fatal编程技术网

Javascript 在我的记忆函数中存储一个函数的参数

Javascript 在我的记忆函数中存储一个函数的参数,javascript,Javascript,我试图让一个函数保存通过它传递的数据的结果和输入。 其思想是,它不应该使用相同的参数运行最近传递的函数,而是返回旧的结果。但如果参数发生变化,它将运行相同的函数 我认为即使在测试时,该函数也在运行 memoize = function(func) { var result; var old_arg={}; var test = function(x, y){ if(!(y in x)){return true;} else{return false;} };

我试图让一个函数保存通过它传递的数据的结果和输入。 其思想是,它不应该使用相同的参数运行最近传递的函数,而是返回旧的结果。但如果参数发生变化,它将运行相同的函数

我认为即使在测试时,该函数也在运行

memoize = function(func) {
  var result;
  var old_arg={};
  var test = function(x, y){
    if(!(y in x)){return true;}
    else{return false;}
  };

  return function (){
     old_arg.arg= arguments;
     if (test(old_arg, func)) {
       result = func.apply(this, arguments);
       old_arg.result = result;
     }
     else{result = old_arg.result;}
     return result;
  };
};

该代码存在两个问题:

  • 测试功能中的
    使用不正确<
    中的code>用于测试对象中是否存在属性<代码>测试
    功能需要比较对象是否相等。使用
    JSON.stringify()
    来比较对象
  • old_arg.arg=参数的位置不正确。这将覆盖参数的旧值,并将新参数与新参数进行比较
  • 以下是正确操作的方法之一:

    memoize = function(func) {
      var result;
      var old_arg={arg:{}, result:{}};
      var compareObjects = function(x, y){
        return (JSON.stringify(x) === JSON.stringify(y));
      };
    
      return function (){
        if (!compareObjects(old_arg.arg, arguments)) {
          result = func.apply(this, arguments);
          old_arg.result = result;
          console.log("new");
        }
        else{result = old_arg.result;console.log("old");}
    
        old_arg.arg= arguments;
        return result;
      };
    };
    
    然后使用以下方法进行测试:

    a = function(a) {
      return a + 10;
    }
    
    a = memoize(a);
    
    console.log(a(10));   //op: new 20
    console.log(a(10));   //op: old 20
    console.log(a(12));   //op: new 22
    

    您在此处尝试的内容:
    test(old_arg,func)
    如果在test函数中选中了
    !(x中的y)
    ?正如你所说:如果在
    a(12)
    之后再次调用
    a(10)
    打印的
    new 20
    而不是
    old 20
    @Grundy:是的,那是因为我们只存储最后的结果。通过将结果和参数存储在列表中并检查列表中的参数,可以轻松地扩展此逻辑以存储最后n个调用。我想这很容易做到。