繁体   English   中英

没有封闭范围的Javascript memoization

[英]Javascript memoization without closure scope

JavaScript Ninja秘密中,作者提出了以下方案,用于在没有闭包的情况下记忆函数结果。 他们通过利用函数是对象并在函数上定义属性来实现这一点,该函数存储过去调用函数的结果。

function isPrime(value) {
    if (!isPrime.answers) isPrime.answers = {};
    if (isPrime.answers[value] != null) {
        return isPrime.answers[value];
    }
    var prime = value != 1
    for (var i = 2; i < value; i++) {
        if (value % i === 0) {
            prime = false;
            break;
        }
    }
    return isPrime.answers[value] = prime;
}

我有两个问题

  1. 他们的逻辑对我来说很有意义,但是当我运行代码时,所有发生的事情都是创建了答案属性但没有添加任何东西 - 为什么?
  2. return isPrime.answers[value] = prime; 对我很有意思,当我使用它时,repl.it会发出警告。 分配并返回同一行中的所有人不赞成?

1.他们的逻辑对我有意义,但是当我运行代码时,所有发生的事情都是创建了答案属性,但没有任何东西被添加到它 - 为什么?

它似乎对我来说很好。

console.log(isPrime(42));
console.log(isPrime.answers)

显示answers是非空对象:

在此输入图像描述

 function isPrime(value) { if (!isPrime.answers) isPrime.answers = {}; if (isPrime.answers[value] != null) { return isPrime.answers[value]; } var prime = value != 1 for (var i = 2; i < value; i++) { if (value % i === 0) { prime = false; break; } } return isPrime.answers[value] = prime; } console.log(isPrime(42)); console.log(isPrime.answers) 

2. [...]在同一条线上分配和归还所有不赞成的东西?

在这种情况下,赋值基本上是副作用 ,副作用是不赞成的。 也就是说,作为表达式并返回指定值的赋值是语言的一个特征,只要它被负责任地使用,为什么不呢。

他们的逻辑对我有意义

它不应该。 该方案仍然在依赖于闭合,特别isPrime ,所述功能驻留在范围可变它们同样已经使用。 var isPrimeAnswers = {}; 而不是isPrime.answers = {}; (两者都应放在功能体之外)。

分配并返回同一行中的所有人不赞成?

取决于你问谁,但并不是一致谴责这是一种不好的做法。 你说它很有趣,其他人觉得它很混乱,我个人认为它很清楚。 如果你没有进入高尔夫代码并希望安全起见,最好将其分成两个语句:

isPrime.answers[value] = prime;
return prime;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM