JavaScript函數遇實參與形參——智能而有原則
1.實參與形參個數可以有偏差,不會因為參數不統一而錯誤。
例1:
functionbox(a,b){ return a + b; } alert(box(1,3,5)); //運行結果:“4”。 //進行的運算為“1+3”,沒有用到“5”。
例2:
functionbox(a,b,c){ return a + b+c; } alert(box(1,'5')); //運行結果:15undefined。 //結果為sring類型。進行的運算1與‘5’的字元串連,再與一個不存在(undefined)的字元串連,結果即為15undefined。
2.JS函數不能重載。
因為“函數重載”靠的就是相同函數名根據參數的不同,匹配特定函數,從而執行函數的過程;而JS函數不再排斥“異形”函數,缺失了辨別相同函數名的不同函數的過程,相同函數名的情況下,JS調用時,只會執行最後一個所調函數。
例3:
function box(a,b,c){ alert('執行了第一個函數,' + a +'+' + c + '='+(a+c)); } function box(a,b,c){ alert('執行了第二個函數,'+ a + '+' + b + '='+(a+b)); } alert(box(1,'5',3)); //執行結果為:執行了第二個函數,1+5=15 //類型為string.
例4:
function box(a,b,c){ alert('執行了第二個函數,'+ a + '+' + b + '='+(a+b)); } function box(a,b,c){ alert('執行了第一個函數,' + a +'+' + c + '='+ (a+c)); } alert(box(1,'5',3)); //執行結果為:執行了第一個函數,1+3=4 //類型為number.
3.函數運用arguments對象,很有特點
arguments對象的使用,很好地解釋了支援形參、實參不一致而不出錯的原理性問題。
3.1 arguments[index]指定參數值,index為參數的索引
例5:
function box(){ return arguments[0]+arguments[5];}alert(box(1,2,3,4,5,6)); //執行結果為:7alert(box('Test','UseCase',3,4,5,6)); //執行結果為:Test6 //arguments[0]表示第一個參數,arguments[5]表示第六個參數;上面兩個執行結果,都反映了,box()函數只用了所需的指定參數,其他參數都被忽略了。
3.2 arguments.length得到參數的個數
例6:
function box(){ return arguments.length;}alert(box(1,2,3,4,5,6)); //執行結果為:6alert(box('Test','UseCase',3,4,5,6)); //執行結果為:6 //當需要知道某序列有多少元素時,將其傳入該函數,即可知道
3.3 arguments.length的擴充運用
例7:
function box(){ var sum = 0; for (var i=0;i
4.一個顯而易見的錯誤(只為下面說明問題)
看了例7,可能會有點迷糊,因而添加例8、例9,都說明了一個問題,參數為函數體提供必要資訊,用於可控地實現功能。函數(function:功能)
例8:
function box(a,b){ return a+b+c;}alert(box(1,2,3)); //ReferenceError:c is not defined alert(box(1,2)); //ReferenceError:c is not defined //字面量c未定義
例9:
function box(){ return a+b+c;} alert(box(1,2,3)); //ReferenceError:a is not defined //字面量a未定義
簡單比較例2、例4、例8,可以得出這樣的結論,JS中的函數體與形參、實參以及形參與實參的關係是:
遵循一個原則:函數實現功能
函數體與形參關係:形參必須滿足函數體的必要需求,否則沒法進行,即使用了形參未定義的‘字面量’,出錯:c is not defined 。
形參與實參關係:實參在形參的尺規下,多出的被攔截而被忽略,缺少的被判斷為undefined(不存在),但都不報錯。
智能:是說JS函數對多出的實參去粗取精,對少的實參做了適當的處理,沒有雷厲加之,使得函數運行更大限度地平穩協調。