将pased函数的参数存储在我的内存函数中

store arguments of a function that is pased in my memory function

本文关键字:函数 我的 内存 参数 pased 存储      更新时间:2023-10-15

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

我认为即使在测试时,该功能也在运行

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

代码有几个问题:

  1. test函数中in的使用不正确。in用于测试对象中是否存在属性。test函数需要比较对象是否相等。请改用JSON.stringify()来比较对象
  2. old_arg.arg= arguments;放置不正确。这将覆盖参数的旧值,并将新参数与新参数进行比较

以下是正确操作的方法之一:

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