JS之函式(一)
函式定義
函式主要分為兩種,其一為常見的函式宣告,其二為函式表示式
1、函式宣告
function test() {}
講解為:函式的特徵值 function + 函式名() {函式體}
2、函式表示式
(1) 命名函式表示式
var test = function test(){}
(2) 匿名函式表示式
var test = function (){}
3、函式中的引數傳遞
(1) 實參
實參即為實際引數,表示當呼叫函式時,而傳遞的引數
(2) 形參
形參即為形式引數,表示當定義函式時,所賦予的引數變數形式
(3)案例
A、案例1
function test(a,b){
var res = a + b;
console.log(res);
console.log(a);
console.log(b);
}
test(1,2);
該案例為簡單的函式型別,呼叫中傳入的實參為1,2,函式test中a,b代表的是形式引數,形式引數在其函式體中是被隱含著定義,實際上存在一條語句為var a,b;
如果呼叫函式為test(1),表明a=1,b由於沒有初始化,因此為undefine,所以最後的res是NAN的形式。
B、案例2
function test(a,b){
if(test.length > arguments.length){
console.log("形參多了");
}else if(test.length < arguments.length){
console.log("實參多了");
}else{
console.log("相等");
}
}
test(1,2);
在JS的函式中,存在arguments陣列,該陣列用於將所有的實參存放於一起。且該陣列中的值只與實參有關,同形參的多少沒有關係。
函式的大小,test.length表示的是形參的個數
例如function test(a,b,c,d,r){}, 則該函式的大小為5-->test.length=5
實參的大小表示為arguments.length
C、案例3
如果存在一種情況,需要計算所有引數之和,即無論呼叫函式中傳遞多少個值,均需要計算出結果;
分析:這種情況屬於不定性,因此無法根據傳遞的實參來定義形參的個數,所以考慮用argument陣列來進行計算求和。
function test(a,b){
var res=0;
for(var i=0;i<arguments.length;i++){
res +=arguments[i];
console.log(arguments[i]);
}
console.log("任意數之和:"+res);
}
test(1,2,1,1,..);
4、arguments指向
function test(a,b){
//隱含語句:var a,b;
//隱含語句:arguments = [1,2];
a = 3;
console.log(arguments[0]); ---->列印值為3
//反之,如果將arguments[0]=2,
arguments[0]=2;
console.log(a);
}
test(1,2);
在該例子中,我們已知曉arguments代表的是將所有的實參接收並存放到陣列中,如果將a的值重新修改,則argument中的值也會隨之發生改變。實際上形參和arguments之間是兩個物件,只是這兩者之間存在一定的關係,即形參會隨著arguments中值的變化而變化,反之同樣如此。
5、練習
(1) 輸入數字,逆轉並輸出漢字形式
function reverse(){
var num = window.prompt("請輸入數字:");
var stringData = "";
if(num){
for(var i=num.length-1;i>=0 ;i--){
stringData +=changeChinese(num[i]);
}
console.log(stringData);
}else{
alert("請輸入引數:");
}
}
function changeChinese(num){
switch(num){
case '1':
return '壹';
case '2':
return '貳';
case '3':
return '叄';
case '4':
return '肆';
case '5':
return '伍';
}
}
reverse();
(2) 實現N的階乘
//階乘計算:例如計算3的階乘 3x2x1=6
// n! = n * (n-1)! 0! = 1;
function countN(n){
if(n == 1 || n == 0){
return 1;
}
return n * countN(n-1);
}
console.log(countN(5));