函数定义
函数主要分为两种,其一为常见的函数声明,其二为函数表达式
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));