上一節(jié)中,我們使用默認參數(shù)特性處理了調(diào)用者未傳參數(shù)的問題。
這一節(jié)中,我們將要處理調(diào)用者傳遞了參數(shù),但函數(shù)未定義參數(shù)的情況。
使用arguments訪問參數(shù)
我們先來分析一下以下代碼:
function sayHi()
{
console.log("Hello somebody!")
}
sayHi("James")
上述代碼中,sayHi()函數(shù)并未定義任何一個參數(shù),但調(diào)用者卻傳遞了參數(shù)"James"。這個腳本會報錯嗎?我們嘗試運行一下:
可以看到,上面腳本并無任何異常,而是正常地輸出了"Hello somebody!"。
由上例可知,調(diào)用者可不管不顧函數(shù)到底定義了多少參數(shù),可以隨意填寫參數(shù)。
在函數(shù)體內(nèi), 有一個變量,存儲著傳遞給當前函數(shù)的所有參數(shù),它就是arguments。arguments是一個數(shù)組,依次存儲著調(diào)用者向函數(shù)傳遞的參數(shù)。
我們通過將上述代碼改造一下來了解arguments變量:
function sayHi()
{
console.log("Hello "+arguments[0]+"!") // 通過arguments[0]引用第一個參數(shù)
}
sayHi("James")
上述代碼中,使用arguments[0]引用了第一個參數(shù)James。所以程序最終輸出如下:
所以,通過arguments對象能夠引用調(diào)用者傳遞的參數(shù)。
使用arguments解決不定長參數(shù)的問題
arguments的一個重要作用是解決變長參數(shù)的問題。
現(xiàn)在,你需要寫一個函數(shù),它能將傳遞進來的參數(shù)全部打印出來。例如:
···
function sayHi(){
// 你需要實現(xiàn)這個函數(shù)
}
sayHi("David") // 1個參數(shù)
sayHi("David", "James") // 2個參數(shù)
...
sayHi("David", "James", ... , "Lucy") // N個參數(shù)
···
函數(shù)定義時,參數(shù)個數(shù)是固定的,而上述問題中,調(diào)用者傳遞參數(shù)是變動的。所以普通函數(shù)參數(shù)無法解決上述問題。這時就到arguments發(fā)揮作用的時候了。
函數(shù)剩余參數(shù)也能解決上述問題。后續(xù)課程中將會介紹 。
讓我們來看一上arguments的解決方案:
function sayHi()
{
for (var i = 0; i < arguments.length; i++)
{
console.log("Hello "+arguments[i]+"!")
}
}
sayHi("David") // 1個參數(shù)
sayHi("David", "James") // 2個參數(shù)
sayHi("David", "James", "Lucy") // N個參數(shù)
我們來看看輸出結(jié)果 :
可以看到,通過使用arguments參數(shù),我們成功解決了變長參數(shù)問題。
好了,這一節(jié)就講到這里。今天,你學(xué)到了一個非常實用的技巧!
什么是匿名函數(shù)?什么是函數(shù)調(diào)用棧?什么是函數(shù)剩余參數(shù)?
請繼續(xù)關(guān)注我的課程,我將在后續(xù)課程中為大家解答上述問題。
想學(xué)計算機技術(shù)嗎?需要1對1專業(yè)級導(dǎo)師指導(dǎo)嗎?想要團隊陪你一起進步嗎?歡迎加我為好友!