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个调用。我想这很容易做到。