1.5 函数
1.5.1 函数定义的两种方式
1. 函数表达式
function关键词前面有东西,就是函数表达式
1.1 有名函数表达式
1.2 虐名函数表达式
有名:var a = function 函数名(){函数体} 函数名唯一,区分大小写
匿名:var a = function(){函数体,用于实现函数功能的语句} 常用
2. 函数声明
function前面没有任何东西,就是函数声明
function name(){函数体}
3.函数的参数
*形式参数 ==>形参
*实际参数 ==>实参
*函数的形参和实参个数可以不相等,形参可以有无数个,实参也可以有无数个,形参和实参是一一对应的;(实参的数量>形参的数量,不会报错的,多出来的值会被arguments接收储存;实参的数量<形参的数量,没有接受到实参的形参值是undefined),实参列表==>arguments是一个类数组,用来储存所有的实参
可以使用console.log(argument)来查看储存的实参的值
*函数的形参和arguments是相互映射的
function mm(a,b,c){
console.log(arguments[3]) //查看第
}
mm(2,3,4,5) ------>控制台显示出为5
1.5.2 argument
使用arguments求出实参(实参的个数不确定)的和, arguments.length 存放的是 实参的个数
function qq(a,b,c,d){
aa=arguments.length;
document.write(aa)
}
qq(1,5,6,8,8,5,5,5,5)
1.5.3实参和argument的映射关系
1.通过形参修改了实参的值,必须形参和实参建立了映射关系时(就是实参和形参一一对应),则实参的修改会映射到arguments上,反之 不会映射到argument上,通过arguments修改是实参的值,则实参的修改会映射到形参上。
通过形参(就是单独定义a=一个值)修改了实参的值,还是通过arguments修改实参的值(图三),都会相互映射,最后的值都会改变
打印出的值是20,不是2
2.如果形参和实参没有建立映射关系时(一对一),是不可能修改形参来映射到arguments上的。
function gg(a,b,c){
c='lalala'
document.write(arguments[2]); ----->undefined 找不到,无法映射
}
gg(2,3)
1.5.4函数的使用
1.实参和形参有多个
function 自定义函数名(形参1,形参2,···){
函数体
}
函数名(实参1,实参2,···);
2.使用函数的返回值
作用:1.把js数据抛出,让这个js数据可以在函数的外部使用
2.结束函数 不执行函数内部的代码
默认情况下,程序在函数的最后一句隐式添加return undefined
return undefined有两个作用
1.表示函数执行结束了
2.函数在结束时抛出一个值(抛到花括号之外),值是undefined
★一个函数内只有一个return,if语句除外
例:
function fn(){ console.log(1); return 22; }
fn(); // 调用 --> 打印出22;
或者 var a = fn, console.log(a) --> 22
函数执行完之后,fn()整体就是return算出的结果,然后赋值给变量a,a=22
例:
function pp(a,b){ return a+b; //---> 函数执行完之后,return把值抛出, //此时pp(2,3)整体就是算出的结果,然后赋值给c,c再打印出来 }, var c=pp(2,3) console.log(c)
例子2:
求出实参的和
var sum = 0; //储存实参的和 function auto(a,b,c,d,e){ for(i=0;i<arguments.length;i++){ sum = sum + arguments[i]; /* sum = 0+arguments[0] = 1 i++ i=1 sum = 1+arguments[1] = 3 i++ i=2 sum = 3+arguments[2] = 35 i++ i=3 */ } console.log(sum); return sum; } auto(1,2,32,3,10) // ---> var a = auto(1,2,32,3,10) console.log(a) //----> 打印出值 //换种写法: console.log(auto(1,2,32,3,10))
若此时我不想在控制台打印出来,当函数整个运行完了之后我return出去,则sum的值就是auto()中的值,此时可以定义一个变量来接收。
★一个函数内只有一个return,if语句除外,if条件分支语句不干扰
例:
function ora(){ If(a>3){ console.log(1) return 1; console.log(2) }else{ console.log(3) return 2; console.log(4)} } console.log(fn(10))
显示结果
3.取位数
输入一个数,取出其百位、十位、个位,/ 除运算,%模运算 也就是取余数
取出百位:parseInt(num/100)
取出十位:parseInt((num%100)/10)
取出个位:parseInt(num%10)
1.5.4 递归 递归是一个函数频繁的调用自身
1. 5的阶乘 (for循环写)
var sum =1; for(var i = 1; i<=5;i++){ sum*=i; } console.log(sum);
2. 把函数封装:
function sum(a){ var sum =1; for(var i = 1;i<=a;i++){ sum=sum*i; } console.log(sum); } sum(10); //可以任意数字
3.
// 5! --->5 * 4!
// 4! --->4 * 3!
// 3! --->3 * 2!
// 2! --->2 * 1!
//当阶乘为1时,返回1
function sum(num){
if(num==1){
return 1;
}
return num*sum(num - 1);
}
console.log(sum(5))
// sum(5)
// sum(5) == 5 *sum(4)
// sum(4) == 5 *sum(3)
// sum(3) == 5 *sum(2)
// sum(2) == 5 *sum(1)
// 必须等到sum(1)知道时才可以算,后面算的先得到结果,从后面开始