js呼叫函式時傳入的引數個數與函式定義時的引數個數不符時的操作
1.在js中函式沒有過載的概念,如果聲明瞭多個重名的函式,不管函式的形參個數是否一樣,只有最有一個有效,其他的函式宣告都是無效的。比如說聲明瞭兩個函式fn(),第一次宣告時沒有形參,第二次宣告時形參有兩個,則在呼叫fn()時不管有沒有傳入引數,都是呼叫後宣告的那個函式。假如說呼叫時只傳入了1個引數,例如fn(1),則1會賦給函式的第一個形參,而第二個形參不會賦值,如果有用到,就會當undefined處理,可能會報錯。如果呼叫時傳入了3個引數,例如fn(1,2,3),則1會賦給第一個形參,2會賦給第二個形參,3是用不上的,但是不會報錯。
2.案例
<
html
>
<
head
>
<
title
>
函式呼叫測試,引數個數和函式宣告不一樣多
</
title
>
<
script
language="JavaScript">
function needTwoPara(p1,p2){
var a=arguments;
var result='我是個需要2個引數的函式\n'
+'您輸入的引數的個數為:'+a.length+'\n'
for(var i=0, len = a.length; i <
len
; i++){
result=result+'第'+(i+1)+'個引數為:'+a[i]+'\n'
}
result+='以上是用arguments來獲得引數\n';
result+='下面用變數來獲得引數:\n';
result+='p1:'+p1+'\n';
result+='p2:'+p2+'\n';
alert(result);
}
</script>
</
head
>
<
body
>
<
form
>
<
input
type="button" value="測試1--傳遞1個引數"
onClick="JavaScript: needTwoPara('smallerpig');">
</
form
>
<
form
>
<
input
type="button" value="測試2--傳遞2個引數"
onClick="JavaScript: needTwoPara('smallerpig','小小豬');">
</
form
>
<
form
>
<
input
type="button" value="測試3--傳遞3個引數"
onClick="JavaScript: needTwoPara('smallerpig','小小豬','生命不息');">
</
form
>
<
form
>
<
input
type="button" value="測試4--傳遞4個引數"
onClick="JavaScript: needTwoPara('smallerpig','小小豬','生命不息','學習不止');">
</
form
>
</
body
>
</
html
>
點選第一個按鈕的返回結果:
我是個需要
2
個引數的函式
您輸入的引數的個數為:
1
第
1
個引數為:smallerpig
以上是用arguments來獲得引數
下面用變數來獲得引數:
p1:smallerpig
p2:
undefined
點選第二個按鈕的返回結果:
我是個需要
2
個引數的函式
您輸入的引數的個數為:
2
第
1
個引數為:smallerpig
第
2
個引數為:小小豬
以上是用arguments來獲得引數
下面用變數來獲得引數:
p1:smallerpig
p2:小小豬
點選第三個按鈕的返回結果:
我是個需要
2
個引數的函式
您輸入的引數的個數為:
3
第
1
個引數為:smallerpig
第
2
個引數為:小小豬
第
3
個引數為:生命不息
以上是用arguments來獲得引數
下面用變數來獲得引數:
p1:smallerpig
p2:小小豬
點選第四個按鈕的返回結果:
我是個需要
2
個引數的函式
您輸入的引數的個數為:
4
第
1
個引數為:smallerpig
第
2
個引數為:小小豬
第
3
個引數為:生命不息
第
4
個引數為:學習不止
以上是用arguments來獲得引數
下面用變數來獲得引數:
p1:smallerpig
p2:小小豬
理解原因:
ECMAScript函式的引數與大多數其他語言中的函式的引數有所不同。ECMAScript函式不介意傳遞進來多少個引數,也不在乎穿進來引數是什麼資料型別。也就是是說,即便你定義的函式值接受兩個引數,在呼叫這個函式時也未必一定要是兩個引數。可以傳遞一個、三個甚至不傳遞引數,而解析器永遠不會有什麼怨言。之所以會這樣,原因是ECMAScript中的引數在內部是用一個數組來執行的。函式接受到的永遠是這個陣列,而不關心陣列中包含哪些引數(如果有引數的話)。如果這個陣列中不包含任何元素,無所謂;如果包含多個元素,也沒問題。實際上,在函式體內可以通過arguments物件來訪問這個引數陣列,從而獲取傳遞給含糊的每一個引數。