【发布时间】:2014-04-10 16:14:26
【问题描述】:
取自Secrets of the JavaScript Ninja,代码 5.14 将 isPrime 的 num 参数传递给 memoized 函数,我假设 num 参数在 #1 中可见,而在 #2 中不可见,但实际上是相反的!
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; //#1
console.log(Array.prototype.slice.call(arguments)); // Prints []
return function(){ //#2
console.log(Array.prototype.slice.call(arguments)); //Prints [17]
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();
assert(isPrime(17), "17 is prime"); //#3
num 参数(在这种情况下为 17)怎么可能只在 inner 闭包(#2)中可见,而在包装 memoize 函数中不可见?我不明白 memoize() 调用何时将 num 参数传递给 #2 中的闭包。
PS。重申并补充上述问题:为什么我在 #1 中看不到 num 参数?
谢谢。
【问题讨论】:
标签: javascript closures memoization