我正在尝试缓存' func.apply(this,func)'值,以便以后可以查找,而不是再次运行该函数。问题在于我不知道如何使用或使用什么作为关键。
有没有办法分配一个可以在以后查找的函数键?
代码示例:
var m = function(func) {
var cached = {};
return function() {
var key = ''; // how do I get or create the key of func.apply(this, func)?
if (cached[key]) {
return cached[key];
}
cached[key] = func.apply(this, arguments);
return cached[key];
};
};
m()函数应该返回一个函数,当调用它时,它将检查它是否已经计算了给定参数的结果,并在可能的情况下返回该值。
答案 0 :(得分:1)
为什么需要带索引的对象?只需存储结果/密钥。
var m = function(func) {
var result=null;
return function() {
if (result===null) {
result = func.apply(this, arguments);
}
return result;
}
};
但我不确定这是你想要的。如果函数根据参数返回不同的值,那么您希望使用基于参数的键。
var m = function(func) {
var results = {};
return function() {
var key = [].slice.call(arguments).join("-");
if (results[key]===undefined) {
results[key] = func.apply(this, arguments);
}
return results[key];
}
};
var multiply = function (a,b) {
return a * b;
}
var mult = m(multiply);
console.log(mult(2,5)); //runs calculation
console.log(mult(2,5)); //uses cache
答案 1 :(得分:1)
您在寻找什么称为Memoization
请参阅:Implementing Memoization in JavaScript
以下是一个例子:
var myFunction = (function() {
'use strict';
var functionMemoized = function() {
// set the argumensts list as a json key
var cacheKey = JSON.stringify(Array.prototype.slice.call(arguments));
var result;
// checks whether the property was cached previously
// also: if (!(cacheKey in functionMemoized.cache))
if (!functionMemoized.cache.hasOwnProperty(cacheKey)) {
// your expensive computation goes here
// to reference the paramaters passed, use arguments[n]
// eg.: result = arguments[0] * arguments[1];
functionMemoized.cache[cacheKey] = result;
}
return functionMemoized.cache[cacheKey];
};
functionMemoized.cache = {};
return functionMemoized;
}());
答案 2 :(得分:-1)
如果您将函数的值作为字符串发送,则可以将其用作具有一个小修改的索引
var m = function(func, scope) {
return function() {
var cached = {};
var index = func; // how do I get or create the index of func.apply(this, func)?
scope = scope || this;
if (!cached[index]) {
func = scope[func]; //Get the reference to the function through the name
cached[index] = func.apply(this, func);
}
return cached[index];
};
};
这取决于this
对象引用中是否存在索引。否则你应该使用不同的范围。