2014-04-19 16 views
0

我想這樣做將被執行到一個數組partial_left功能,一些liek是:的JavaScript:部分功能,爲什麼是必要的Array.prototype.slice.call做(參數)

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

,但是當我將參數的變量推送到另一個數組(而不是Array.prototype.slice.call(參數))時,我崩潰了。因爲我想要做的其他方式,但我驚訝的是,結果是型動物:

 var array_1=[1,2,3]; 

用我的方法:日結果是:[1,1,1] //只到數組做參考[0]

與陣列,prototype.slice.call:[1,2,3] //如何將我想是

這是我的代碼,其中,I推在另一個陣列的參數的值:

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.proto的代碼type.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); 
      }; 
    } 

的平等與局部的簡單定義:

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 

某人的誰知道請給我解釋一下什麼是「的毗連」,並使用「Array.prototype.slice.call」之間的區別是什麼?

回答

0

糟糕的設計決定之一:arguments不是一個數組。它是array-like,在某種意義上它有一個length屬性。

您不能撥打concat方法arguments,因爲它不存在。

Array.prototype.slice.call使用數組中的slice方法並調用它 - 這是一種將array-like變成適當數組的快捷方法。

你可以做同樣的事情用一個循環,如果你想:

var arr = []; 
for (var i = 0; i < arguments.length; i++) { 
    arr[i] = arguments[i]; 
} 
相關問題