2015-12-16 36 views
0

我知道參數是每個函數中的一個類似數組的對象,但我不確定爲什麼我們需要它以及我們如何使用它?下面是一個讓我困惑的例子...試圖理解Javascript中參數數組的概念

所以,爲什麼我們不能簡單地把var args = [],而是在參數上使用slice?

(林不知道,如果它是一個很好的例子來解釋arugments,但即時通訊也想了解如何申請()的作品在這裏...)

_.delay = function(func, wait) { 
    var args = slice.call(arguments, 2); 
    return setTimeout(function(){ 
     return func.apply(null, args); 
    }, wait); 
    }; 

回答

1

.apply()讓你調用一個函數,同時指定兩個不同的東西:

  1. 函數調用內部的this指針的值。
  2. 當參數的來源是數組時,傳遞給函數的一組參數。

一個通常會使用.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); 
 
}

1

後,該代碼會得到任何參數第一個2,並把它們放入一個新的數組中。如果將其設置爲空數組,則除了已命名的參數之外,不會有任何可能已傳遞的參數。

考慮以下2個片段之間的差:

var slice = Array.prototype.slice; 
 

 
function test(a, b) { 
 
    var args = slice.call(arguments, 2); 
 
    console.log(args); 
 
} 
 
test(1, 2, 3, 4);

控制檯輸出:

[3, 4]

function test(a, b) { 
 
    var args = []; 
 
    console.log(args); 
 
} 
 
test(1, 2, 3, 4);

控制檯輸出:

[]

有必要稱之爲切片的參數陣列上,因爲參數對象僅僅是陣列狀,並且不包括這種方法。

+0

但爲什麼不能傳入額外的參數,如果我把它設置爲空數組? – Danny

+0

@Danny因爲在參數對象中可能會有更多的參數,這些參數會包含在切片數組中。一個空數組永遠不會包含它們。 –