1. 程式人生 > 實用技巧 >js呼叫函式時傳入的引數個數與函式定義時的引數個數不符時的操作

js呼叫函式時傳入的引數個數與函式定義時的引數個數不符時的操作

1.在js中函式沒有過載的概念,如果聲明瞭多個重名的函式,不管函式的形參個數是否一樣,只有最有一個有效,其他的函式宣告都是無效的。比如說聲明瞭兩個函式fn(),第一次宣告時沒有形參,第二次宣告時形參有兩個,則在呼叫fn()時不管有沒有傳入引數,都是呼叫後宣告的那個函式。假如說呼叫時只傳入了1個引數,例如fn(1),則1會賦給函式的第一個形參,而第二個形參不會賦值,如果有用到,就會當undefined處理,可能會報錯。如果呼叫時傳入了3個引數,例如fn(1,2,3),則1會賦給第一個形參,2會賦給第二個形參,3是用不上的,但是不會報錯。

2.案例

<html>

<head>

<title>

函式呼叫測試,引數個數和函式宣告不一樣多

</title>

<scriptlanguage="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>

<inputtype="button" value="測試1--傳遞1個引數"

onClick="JavaScript: needTwoPara('smallerpig');">

</form>

<form>

<inputtype="button" value="測試2--傳遞2個引數"

onClick="JavaScript: needTwoPara('smallerpig','小小豬');">

</form>

<form>

<inputtype="button" value="測試3--傳遞3個引數"

onClick="JavaScript: needTwoPara('smallerpig','小小豬','生命不息');">

</form>

<form>

<inputtype="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物件來訪問這個引數陣列,從而獲取傳遞給含糊的每一個引數。