我試圖寫一個函數 ,將使用其第一個參數,然後發送其餘的(不知道有多少)到另一個問題:調用一個函數被調用的參數列表的尾部
function consume_data() {
args = consume_data.arguments;
do_some(args[0]);
consume_the_rest(args[1], args[2], args[3] ...);
}
我是否必須使用字符串來編寫呼叫和評估,還是有一個更好的方法?
我試圖寫一個函數 ,將使用其第一個參數,然後發送其餘的(不知道有多少)到另一個問題:調用一個函數被調用的參數列表的尾部
function consume_data() {
args = consume_data.arguments;
do_some(args[0]);
consume_the_rest(args[1], args[2], args[3] ...);
}
我是否必須使用字符串來編寫呼叫和評估,還是有一個更好的方法?
傳統的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])
...所以第一個參數實際上將被用作調用上下文,而其餘的將是你所期望的人。
同樣,只有在你不關心你所調用的函數的調用上下文時才這樣做。
function consume_data() {
do_some(arguments.shift());
consume_the_rest.apply(this, args);
}