不使用全局变量的Javascript缓存

不使用全局变量的Javascript缓存,javascript,Javascript,我试图优化函数的使用,以检查数字是否为素数 我编写了以下函数: function isPrime(num) { var start = 2; // code to check whether num has already been checked for Prime while(start <= Math.sqrt(num)) { if (num % start++ < 1) { return false; }

我试图优化函数的使用,以检查数字是否为素数

我编写了以下函数:

function isPrime(num) {
    var start = 2;

    // code to check whether num has already been checked for Prime

    while(start <= Math.sqrt(num)) {
      if (num % start++ < 1) {
        return false;
      }
    }
    return num > 1;
}
函数isPrime(num){
var启动=2;
//用于检查是否已为素数检查num的代码
同时(开始1;
}
但是,在执行
while
循环之前,我想检查一个数字是否已经通过isPrime函数传递,这样我就可以返回它是否为prime,而不必执行
while
循环


请注意,我希望在不使用全局变量或不扩展
对象的情况下执行此操作。prototype

您要查找的是记忆模式

发件人:

在计算中,记忆是一种优化技术 主要用于通过存储计算结果来加速计算机程序 昂贵的函数调用,并在相同的情况下返回缓存结果 输入再次出现

您可以编写(如其他答案所示)或使用npm上提供的许多优化的经过良好测试的实现中的一种,如或。如果您已经使用Lodash,它也有自己的功能

例如:

var isPrime = memoize(/* your function */)

isPrime(2) // => true
isPrime(2) // => true (from the cache)

在中声明变量以创建


checked\u numbers
在返回的
isPrime
函数的范围内(由于它(函数本身)被分配给了一个全局变量,所以在IIFE之外可以访问该函数),但IIFE之外的任何东西都不能触及它。

您可以使用记忆技术

记忆是一种编程技术,它试图通过缓存以前计算的结果来提高函数的性能。

基本思想是,我们构建一个空对象,然后添加键作为散列值或参数值,然后如果我们得到一个已经在对象键上可用的参数,那么我们返回该键的对象值

下面的函数有几个变体,但这个实现的性能比其他实现要好得多

用法:

var cachedIsPrime = memoize(isPrime);
var isPrime = cachedIsPrime(2);
isPrime = cachedIsPrime(3);
然后你可以传递需要记忆的函数

操作说明: 对于具有单个参数的上述上下文,可以使用如下简单的memoize函数:

var memoize = function(passedFunc) {
    var cache = {};
    return function(x) {
        if (x in cache) return cache[x];
        return cache[x] = passedFunc(x);
    };
};

请注意,如果您关心性能,您还应该考虑使用seive来代替它,或者至少从循环头中调用
Math.sqrt()
。seive将有效地用于缓存。seive如何作为我的缓存的用途?因为seive是每个数字的映射(不超过已计算数量的限制)和指示数字是否为素数的标志。
var cachedIsPrime = memoize(isPrime);
var isPrime = cachedIsPrime(2);
isPrime = cachedIsPrime(3);
var memoize = function(passedFunc) {
    var cache = {};
    return function(x) {
        if (x in cache) return cache[x];
        return cache[x] = passedFunc(x);
    };
};