【发布时间】:2016-07-01 08:12:22
【问题描述】:
我正在阅读 John Resig 的 Javascript Ninja,记忆化一章中提到了这个概念,我无法弄清楚它是如何工作的。我在谷歌上找不到解释。所以,这里是书中的例子。
Function.prototype.memoized = function(key){
this._values = this._values || {};
return this._values[key] !== undefined ?
this._values[key] :
this._values[key] = this.apply(this, arguments);
};
Function.prototype.memoize = function(){
var fn = this;
return function(){
return fn.memoized.apply( fn, arguments );
};
};
var isPrime = (function(num) {
var prime = num != 1;
for (var i = 2; i < num; i++) {
if (num % i == 0) {
prime = false;
break;
}
}
return prime;
}).memoize(); // I don't understand how this works
现在,我了解了这个示例中的闭包是如何工作的,并且我大致了解了原型,但是我不明白这个 (function expression).memoize() 部分是如何工作的?我看到 memoize 返回一个函数,并且该函数(我假设)被添加到 isPrime,但是这个 (function expression) 是如何被调用的,或者它如何作为 isPrime 方法的一部分?那么,当我调用isPrime(17)时,首先执行的是什么?
编辑: 好的,我现在对所有的命令感到困惑,所以这就是我现在的看法。
-
首先:当
(function(num){....}).memoize()被调用时,匿名函数表达式(function(num){...})在memoize函数中表示为this并赋值给fn。 -
第二:在 memoize 中返回一个匿名函数,该函数通过闭包保存
fn。返回的匿名函数分配给isPrime -
第三:当我们调用
isPrime(17)时,实际上调用的是fn.memoized.apply(fn, attributes),而在memoized里面this(上下文)表示fn,它是对匿名函数(function(num{...} ))。而这部分:this.apply(this, arguments)执行该匿名函数 (function(num) {...})这是有道理的,首先需要检查该数字是否被缓存,如果不是,则检查它是否为素数并将其放入缓存中。
【问题讨论】:
-
函数表达式成为
memoize方法内的this值。 -
记住 () 里面的东西会被立即调用。很像
(isTrue === true) ? "":"" ;这样的内联 if 语句,其中表达式 `(isTrue === true) ?在运行时进行评估。 -
这意味着 (function(){return true}) 将在运行时调用,您不需要调用它。
-
啊哈!所以它实际上在这部分被调用, this._values[key] = this.apply(this, arguments); ?
-
不,当您设置
var isPrime = (function(){})时它会被调用。this.apply()是原生函数
标签: javascript closures