【发布时间】:2016-05-10 03:45:27
【问题描述】:
在 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;
}
我有两个问题
- 他们的逻辑对我来说是有意义的,但是当我运行代码时,所发生的只是创建了 answers 属性,但没有添加任何内容 - 为什么?
-
return isPrime.answers[value] = prime;行对我来说很有趣,并且 repl.it 在我使用它时会发出警告。在同一行中分配和返回所有内容是否令人不快?
【问题讨论】:
-
尝试用这个替换 isPrime
-
@ayushgp:为什么?那是错误的。你觉得
this会指什么? -
对我来说似乎工作得很好:jsfiddle.net/5u0ua5bp。
isPrime.answers作为属性为 42 的对象。 -
我和@FelixKling 在一起,它在本地对我有用。可能很愚蠢的问题,您是否在检查答案的值之前调用该函数?
-
@FelixKling 我认为它应该引用函数对象。没有,我查了。但那它指的是什么?
标签: javascript closures memoization