Javascript:如何获取function.apply()的键

时间:2016-05-18 03:21:44

标签: javascript arrays

我正在尝试缓存' 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()函数应该返回一个函数,当调用它时,它将检查它是否已经计算了给定参数的结果,并在可能的情况下返回该值。

3 个答案:

答案 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对象引用中是否存在索引。否则你应该使用不同的范围。