Javascript 为什么在D.Flanagan';s";JS:最终指南;需要参数。长度?
我正在浏览David Flanagan的“Javascript:权威指南” 在第8.8.4段中,他展示了一个高阶函数,Javascript 为什么在D.Flanagan';s";JS:最终指南;需要参数。长度?,javascript,function,arguments,memoization,higher-order-functions,Javascript,Function,Arguments,Memoization,Higher Order Functions,我正在浏览David Flanagan的“Javascript:权威指南” 在第8.8.4段中,他展示了一个高阶函数,memoize(),该函数接受一个函数作为其参数,并返回该函数的一个memoized版本: //Return a memoized version of f. // It only works if arguments to f all have distinct string representations. function memoize(f) { var
memoize()
,该函数接受一个函数作为其参数,并返回该函数的一个memoized版本:
//Return a memoized version of f.
// It only works if arguments to f all have distinct string representations.
function memoize(f) {
var cache = {}; // Value cache stored in the closure.
return function() {
// Create a string version of the arguments to use as a cache key.
var key = arguments.length + Array.prototype.join.call(arguments,",");
if (key in cache) return cache[key];
else return cache[key] = f.apply(this, arguments);
}
}
解释中有:“返回的函数将其参数数组转换为字符串。”
如果我们只需要参数,为什么他要将
arguments.length
与Array.prototype.join.call(arguments,“,”)
连接起来,而不是仅将arguments数组转换为字符串?,因为否则这两个调用将使用相同的键存储:
memoizedFunc('', '');
memoizedFunc(',');
在这两种情况下,连接参数的结果都使用相同的字符串:
,
,因为否则这两个调用将使用相同的键存储:
memoizedFunc('', '');
memoizedFunc(',');
在这两种情况下,使用相同字符串连接参数结果:
,
此函数已中断。即使所有参数都是字符串,它也不起作用。请参见此示例:
//返回f的记忆版本。
//仅当f all的参数具有不同的字符串表示形式时,它才起作用。
函数记忆(f){
var cache={};//值缓存存储在闭包中。
返回函数(){
//创建要用作缓存键的参数的字符串版本。
var key=arguments.length+Array.prototype.join.call(arguments,“,”);
if(key in cache)返回cache[key];
else返回cache[key]=f.apply(这是参数);
}
}
常量f=memoize(函数(…参数){
console.log('f被调用')
返回参数
})
console.log(f(',','')
console.log(f(“”,’)
此函数已中断。即使所有参数都是字符串,它也不起作用。请参见此示例:
//返回f的记忆版本。
//仅当f all的参数具有不同的字符串表示形式时,它才起作用。
函数记忆(f){
var cache={};//值缓存存储在闭包中。
返回函数(){
//创建要用作缓存键的参数的字符串版本。
var key=arguments.length+Array.prototype.join.call(arguments,“,”);
if(key in cache)返回cache[key];
else返回cache[key]=f.apply(这是参数);
}
}
常量f=memoize(函数(…参数){
console.log('f被调用')
返回参数
})
console.log(f(',','')
log(f(“”,’)
,因为它稍后用于访问调用缓存。如果使用不同数量的参数调用方法,则会有所不同,因为它稍后用于访问调用的缓存。如果您使用不同数量的参数调用方法,或者您可以使用Map()将复杂值存储为键,或者您可以使用Map()将复杂值存储为键,则会有所不同: