为什么John Resig的JavaScript需要第二次关闭?
作者:互联网
我在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();
我理解这段代码的大部分内容.但是我理解的是,为什么在第二个memoization函数不能简单地:
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函数并返回其返回值.
标签:javascript,closures,anonymous-function,memoization 来源: https://codeday.me/bug/20190629/1329198.html