Javascript 为什么在D.Flanagan';s";JS:最终指南;需要参数。长度?

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

我正在浏览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 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()将复杂值存储为键,则会有所不同: