我只是想知道是否有办法将函数x(...){...}的参数提取到全局范围,并可能将它们存储到变量中。
我知道如果你构造一个函数,你可以返回“arguments”对象,但这不是我想要的,因为函数是未知的。
为了给出我想要这样做的一些上下文,我试图创建一个函数“a”,它接收一个函数“x”作为参数,我需要返回一个函数“y”当被调用时,它将检查它是否已经计算了给定参数的结果,并在可能的情况下返回该值。
我知道这可能不是完成它的最佳方法。
答案 0 :(得分:1)
您尝试执行的操作的术语是"memoization",并且不需要将参数导出到全局范围。
如果你使用Lodash / Underscore,它有一个built in function:
var calculate = function (num) {
console.log('I have been called!');
...
};
calculate = _.memoize(calculate);
console.log(calculate(4));
console.log(calculate(5));
console.log(calculate(4));
答案 1 :(得分:1)
我猜错了你想做什么,但这是一个结构性的想法。这会创建一个缓存其结果的函数,因此对于给定的输入参数,结果只计算一次(然后在缓存之后从缓存中检索)。它假定函数的参数是一个字符串或其他任何具有唯一toString()
转换的内容。
var myFunc = (function() {
var cache = {}, has = Object.prototype.hasOwnProperty;
return function(arg) {
if (has.call(cache, arg)) {
return cache[arg];
} else {
// do your calculation on arg to generate result
// ...
cache[arg] = result;
return result;
}
}
})();
此实现针对具有单个参数的函数进行了优化,但是如果您希望基于多个参数进行缓存,则可以通过基于所有参数和基于的缓存的组合构建唯一键来对其进行扩展。那把钥匙。