先上代码:Function.method('curry', function() {
    var slice = Array.prototype.slice,
        args = slice.apply(arguments),
        that = this;
    return function() {
        return that.apply(null,args.concat(slice.apply(arguments)));
    };
});
书中说道,因为arguments实际上不是真正的数组,所以要通过应用slice来产生出真正的数组,我的问题就是这个产生真正的数组的code:
slice.apply(arguments)
这句看得我茫茫然,apply不是要2个参数吗?这里怎么就1个了,另外为什么使用slice呢?用数组的其他方法可以吗?请问这句到底是什么原理?

解决方案 »

  1.   

    www.w3cshool.com.cn如果你对apply函数有不理解的地方,参考上面的网站,apply可以只有一个参数,第二个参数是传入给调用函数的参数,既然不传参数,那就是没参数调用呗,有什么问题吗?LZ还是先看看比较全面的书籍吧,再来看这种总结类的书
      

  2.   

    当然,按slice的方法来看,是必须要有一个参数的,但是如果没参数的话,会返回数组的副本,不信可以去试下,所以真正严格的说,LZ看的那本书的代码似乎不太严密
      

  3.   

    还有LZ你的代码是不是没上全,Function类的method这个方法是不是前面已经定义过了
      

  4.   


    嗯,method是之前自定义的方法,我只是截取了没看懂的那段,我从你的解释里已经明白了,看来是我对slice和apply的理解有问题,slice不用参数就会返回数组本身,在这里的话,arguments本来不是数组,但用了slice这个方法的话,返回了一个是arguments的数组,你说是代码不严谨,但是我好想感觉用的挺妙的...
    另外就是apply,看来只有一个参数也是可行的,我一直以为要两个参数...
    谢谢,不知道我这么理解是不是对了?
      

  5.   


    至于书的问题,其实我已经看过2遍Javascript高级程序设计了,应该是看得太粗了,结果现在感觉很多东西自己没看到,不过既然换书了,就想坚持下去,等看完了,再回过头去看一遍高级程序设计,看看到底是自己漏了,还是的确没讲...
      

  6.   


    不严谨的地方就是在于slice的方法没加参数,这个我也是今天看了你的代码自己去试了下才发现也可以,但是不符合W3C标准的,如果这样写搞不好哪天浏览器就解释不了了,正确的应该是slice(0)的写法!
    可以用arguments instanceof Array来测试是否是数组。
      

  7.   


    我估计是看得不够细吧,apply任何JavaScript的书籍都应该会讲到的,我也是前2个星期才把第二版的高级程序设计看完,你问的几个问题,第二版上都有完整的小节叙述,现在你问的curry化函数也有说明