JavaScript:部分函数,​​为什么需要使用Array.prototype.slice.call(arguments)

时间:2014-04-19 08:09:03

标签: javascript arrays function partial

我想做一个将被执行到数组中的partial_left函数,其中包括:

      array_1.map(partial_left1(equal));
      function equal(x){return x;}

,但是当我将参数的变量推送到另一个数组(而不是使用Array.prototype.slice.call(arguments))时,我崩溃了。因为我想做其他方式,但当结果不同时我感到很惊讶:

      var array_1=[1,2,3];

使用我的方法:结果是:[1,1,1] //仅对数组[0]进行引用

with Array,prototype.slice.call:[1,2,3] //我希望如何成为

这是我的代码,我在其中推送另一个数组中的参数值:

    function concat(arg1,arg2,n){
        for (var i = n; i < arg2.length; i++)
            arg1.push(arg2[i]);
        return arg1;
    }
    function partial_left1(f){
        var argum_apply=[];
        argum_apply=concat(argum_apply,arguments,1);
        return function(){
            argum_apply=concat(argum_apply,arguments,0);
            return f.apply(this,argum_apply);
        };
    }

这是Array.prototype.slice.call的代码:

    function array(a, n) { return Array.prototype.slice.call(a, n || 0); }
    function partial_left2(f /*, ...*/) {
         var args = arguments;
         return function() { 
                var a = array(args, 1);
                a = a.concat(array(arguments));
                return f.apply(this, a); 
          };
    }

与partial相等的简单定义:

    var equal_left1=partial_left1(equal);
    var equal_left2=partial_left2(equal);

以下是结果,我不知道为什么他们是不同的?

    var array_1=[1,2,3];
    alert(array_1.map(equal_left1));//1,1,1
    alert(array_1.map(equal_left2));//1,2,3

有些人知道请解释一下&#34; Concat&#34;之间的区别。并使用&#34; Array.prototype.slice.call&#34;?

1 个答案:

答案 0 :(得分:0)

一个糟糕的设计决策:arguments不是数组。它是array-like,在某种意义上它具有length属性。

您无法调用concat的{​​{1}}方法,因为它不存在。

arguments使用数组中的Array.prototype.slice.call方法并调用它 - 这是将slice转换为正确数组的快速简便方法。

如果你愿意,你可以用循环做同样的事情:

array-like