.apply()
讓你調用一個函數,同時指定兩個不同的東西:
- 函數調用內部的
this
指針的值。
- 當參數的來源是數組時,傳遞給函數的一組參數。
一個通常會使用.call()
如果參數的數目傳遞到預先已知的功能和將通常使用.apply()
時的參數的數量不預先知道並且因此參數是在陣列中或可以被放入一個數組中。
據推測,slice()
在你展示的代碼示例爲Array.prototype.slice
,這樣的代碼示例斂集的參數的前兩個之後將它們放入各自爲陣,這樣他們就可以傳遞給原來的功能。
Javascript中的arguments
對象是「類似數組」的。它有一個.length
屬性,並且像數組一樣索引爲零,但它沒有任何數組方法。所以,如果你想使用像.slice()
這樣的數組方法將一些元素複製到一個新數組中,你必須從Array原型手動指定數組方法,而不是直接在參數對象上使用.slice()
。
所以,如果你叫:
function myFunc(a, b, c, d) {
// four arguments present here
}
_.delay(myFunc, 100, 1, 2, 3, 4);
的_.delay()
的內部運作將跳過傳遞給它的前兩個參數(因爲這些都是直接在_.delay()
使用和得到公正的remaing最後四個參數,然後使用.apply()
這些信息傳遞給回調函數
這裏的工作片斷,例如:
var _ = {};
var slice = Array.prototype.slice;
_.delay = function(func, wait) {
var args = slice.call(arguments, 2);
return setTimeout(function(){
func.apply(null, args);
}, wait);
};
function myFunc() {
log("number of arguments passed to myFunc(): " + arguments.length);
log(JSON.stringify(slice.call(arguments)));
}
_.delay(myFunc, 500, 1, 2, 3, 4)
function log(x) {
var div = document.createElement("div");
div.innerHTML = x;
document.body.appendChild(div);
}
但爲什麼不能傳入額外的參數,如果我把它設置爲空數組? – Danny
@Danny因爲在參數對象中可能會有更多的參數,這些參數會包含在切片數組中。一個空數組永遠不會包含它們。 –