2012-03-26 35 views
2

我試圖寫一個函數 ,將使用其第一個參數,然後發送其餘的(不知道有多少)到另一個問題:調用一個函數被調用的參數列表的尾部

function consume_data() { 
    args = consume_data.arguments; 
    do_some(args[0]); 
    consume_the_rest(args[1], args[2], args[3] ...); 
} 

我是否必須使用字符串來編寫呼叫和評估,還是有一個更好的方法?

回答

5

傳統的JavaScript方式......不幸的是。

function consume_data() { 

    do_some(arguments[0]); 

    var args = Array.prototype.slice.call(arguments, 1); 

    consume_the_rest.apply(this, args); 
} 

您應該使用在局部變量的作用域提供的arguments變量。然後從Array.prototype借用.slice()以獲得從第二個開始的參數數組。

然後使用.apply()方法將這些參數作爲集合傳遞,這些參數將在consome_the_rest方法中解構爲單獨的參數。


爲什麼?

你需要借Array.prototype.slice是一個arguments對象是不是一個真正的數組的原因,所以它不具備原型陣列的方法。

.apply()的第一個參數設置調用上下文this值),我們在調用函數的,正如我上面提到的,args陣列將在函數的執行上下文被解體成單個參數你在打電話。這就是能夠傳遞未知數量的參數的原因。


的替代,具有警告。

如果你不關心函數的調用情況下,你可以真正做到這一點,而不是...

function consume_data() { 

    do_some(arguments[0]); 

    consume_the_rest.call.apply(consume_the_rest, arguments); 
} 

這裏.call()方法就像.apply()除了您傳入參數分別而不是作爲一個集合。所以我們使用.apply()來呼叫.call(),它將consume_the_rest設置爲調用上下文.call(),並將arguments分散出來,將第一個參數設置爲.call()的調用上下文參數,其餘參數將被傳遞。

這將是好像你沒有...

consume_the_rest.call(arguments[0], arguments[1], ...arguments[n]) 

...所以第一個參數實際上將被用作調用上下文,而其餘的將是你所期望的人。

同樣,只有在你不關心你所調用的函數的調用上下文時才這樣做。

1

Function.apply

function consume_data() { 
    do_some(arguments.shift()); 
    consume_the_rest.apply(this, args); 
} 
相關問題