我正在阅读John Resig和Bear Bibeault的Secrets of the JavaScript Ninja,目前是关于闭包的第5章。我认为有闭包的一般要点,以及JavaScript如何使用函数作用域而不是我熟悉的C++/Java的块作用域进行操作。我无法完全理解的一件事是,有时在代码中似乎有更多的函数声明,超出了我所能弄清楚的目的。例如,在第 5.5.1 节中,他介绍了自记忆函数,它基本上是一个记忆计算值并将其存储在缓存中的函数,以便使用相同输入进行后续调用。他给出了以下代码:
Function.prototype.memoized = function (key) { // #1
this._values = this._values || {};
xyz = this._values;
return this._values[key] !== undefined ?
this._values[key] :
this._values[key] = this.apply(this, arguments);
};
Function.prototype.memoize = function () { // #2
var fn = this;
return function() { // #2.1
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();
我理解大部分代码。然而,我难以理解的是为什么在第二个记忆功能不能简单地是:
Function.prototype.memoize = function () {
return this.memoized.apply(fn, arguments);
};
谁能给我一个很好的解释,说明他的代码上面发生了什么,以及它与我在这里写的代码有什么不同?
有很大的区别:
return function() {
return fn.memoized.apply(fn, arguments);
};
返回稍后可以调用的函数。 仅当调用函数时,才会调用memoized
。
return this.memoized.apply(fn, arguments);
调用函数memoized
并返回其返回值。