arguments

js权威指南中的记忆函数

function memorize(f){
    var cache = {};
    return function(){
        //为什么key要这样赋值,如果arguments.length + arguments.join(",")这样写会报错
        var key = arguments.length + Array.prototype.join(arguments, ",");
        if(key in cache) return cache[key];
        //apply()第二个参数是数组,arguments在这可以当作数组传递参数,那为什么在上面不能使用arguments.join(",")
        else return cache[key] = f.apply(this, arguments);
    }
}
function gcd(a, b){
    return a + b;
}
var gcdmemo = memorize(gcd);
gcdmemo(1, 2);
阅读 2.5k
4 个回答

arguments不是数组,是类数组对象,如果一定要使用array方法,可以考虑通过下面的方法调用

Array.prototype.join.call(...)

arguments不是数组,自然不能用数组的那些api

arguments是类似数组的对象。能用for循环遍历,但是不能用数组的方法。

你的代码第五行应该是:

var key = arguments.length + Array.prototype.join.call(arguments, ",");

为什么key要这样赋值? 保证key的唯一性。
arguments.join(",")会报错,应该arguments是类数组,不是数组,所以不能调用数组的join方法。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏