2013-02-14 14 views
4

1)我有以下代碼:問題Array.prototype.slice.appy(參數1)

var callIt = function(fn) { 
    return fn.apply(this, Array.prototype.slice.apply(arguments, 1)); 
}; 

時CALLIT被調用的NodeJS,它抱怨:

return fn.apply(this, Array.prototype.slice.apply(arguments, 1)); 
               ^
TypeError: Function.prototype.apply: Arguments list has wrong type 

2)如果我改變CALLIT到:

var callIt = function(fn) { 
    return fn.apply(this, Array.prototype.slice.apply(arguments)); 
}; 

的NodeJS不抱怨,但結果不是我們所期望的,在通過額外的第一個參數

3)如果我改變CALLIT到:

var callIt = function(fn) { 
    var args = Array.prototype.slice.apply(arguments); 
    return Function.prototype.apply(fn, args.slice(1)); 
    //return fn.apply(this, args.slice(1)); //same as above 

}; 

它按預期工作。

4)如果我像這樣運行在Chrome開發者工具控制檯測試:

> var o={0:"a", 1:"asdf"} 
undefined 
> o 
Object 
0: "a" 
1: "asdf" 
__proto__: Object 
> Array.prototype.slice.call(o,1) 
[] 
> Array.prototype.slice.call(o) 
[] 

現在片不能在陣列狀物體的工作。

我對這些感到困惑。請解釋。

我引用如下: Array_generic_methods

回答

5

你的問題是,apply method of functions預計數組作爲其第二個參數 - 這就是你的類型錯誤的來源,你通過1。相反,使用[1]或更好的call method

fn.apply(this, Array.prototype.slice.call(arguments, 1)); 

爲什麼沒有在{0:"a", 1:"asdf"}工作的原因是,這是不是一個類似數組的對象 - 它沒有length財產。 [].slice.call({0:"a", 1:"asdf", length:2}, 0)會做到這一點。

+0

謝謝大家。我是JavaScript的新手,並試圖最近在JavaScript上測試嚴重的部分。 – 2013-02-14 08:53:10