4. 函数和对象
4.1 函数 :系统函数和自定义函数
自定义函数:
function 是一个功能体,可以接受若干个参数,返回特定的值
系统函数:parseInt()/parseFloat()....
4.1 创建函数方法
(1)创建普通函数
function 函数名称(){ 函数体——封装的反复执行的代码 } |
调用:函数名称() |
练习:创建函数,封装10+20的计算结果并打印出来,调用3次。 |
练习:创建函数,封装计算1~100之间所有整数的和并打印结果,调用3次 |
|
function add(){ console.log(10+20); } add();add();add(); |
function add2(){ for(var i=1,sum=0;i<=100;i++){ sum+=i; } console.log(sum); } add2();add2();add2(); |
|
(2)创建带有参数的函数
function 函数名称(参数列表){ //形参 -> 用于接收数据 函数体 } |
参数列表:参数可以有多个,用形参
调用: 函数名称(参数列表) //实参 ->实际要传递的数据
|
参数列表:可以是0个或者多个,之间用逗号隔开;创建时的参数称为形参,调用时的参数称为实参,实参会赋值给形参;形参可以看成一个变量,值是未赋值,未赋值默认是undefined;如果实参的个数小于形参的个数,则未赋值的形参为undefined。
练习:创建函数getSum,传递1个参数,计算1~任意数字之间所有整数的和,调用3次。 |
练习:创建函数getRun,传递2个参数,计算任意两个年份之间的闰年个数,调用3次。 |
function getSum(n){ for(var i=0,sum=0;i<=n;i++){ sum+=i } console.log(sum); } getSum(15); getSum(30); getSum(5); |
function getRun(a,b){ for(var i=a,count=0;i<=b;i++){ if(i%4==0 && i%100!=0 || i%400==0){ count++; } } console.log(count); } //参数1赋给a,参数2赋给b getRun(2000,2020);getRun(1900,1990); getRun(2000,2050); |
(3)创建有返回值的函数
function 函数名称(参数列表){ 函数体 return 返回值; //函数的返回结果 } |
调用:函数名称(参数列表) return::表示函数执行后返回的结果,可以保存下来 函数调用后会得到return的值 |
注意事项:
1. 如果没有return或者return后没有返回值,结果都是 undefined
2. return出现以后,return后面的所有代码不会执行
练习:创建函数getMax,传递2个参数,返回两个数字中的最大值。 |
//计算任意三个数字的和,并把结果返回 |
//练习:创建函数getMax,传递3个参数,返回三个数字中的最大值 |
练习:创建函数getStatus,传递1个参数,根据状态码返回对应的中文 1-等待付款 2-等待发货 3-运输中 4-已签收 5-已取消 |
function getMax2(a,b){ if(a>b){ return a; }else{ return b; } } var result= getMax2(5,2); console.log(result); |
function add3(a,b,c){ return a+b+c; } //函数结果保存到变量中 var result=add3(4,5,6); console.log(result); |
function getMax3(a,b,c){ var max=a>b ? a : b; return max>c ? max : c; } var max=getMax3(3,2,7); console.log(max); |
function getStatus(s){ switch(s){ case 1: return '1-等待付款'; case 2: return '2-等待发货'; case 3: return '3-运输中'; case 4: return '4-已签收'; case 5: return '5-已取消'; default: return '状态码有误'; } } console.log(getStatus(4)); |
//计算1~任意数字之间的所有整数阶乘的和 |
//1.创建函数getJc,传递一个参数计算任意数字的阶乘 function getJc(n){ for(var i=1,ride=1;i<=n;i++){ ride*=i; } return ride; } //2.计算1~任何数字之间整数的和 function getSum(n){ for(var i=1,sum=0;i<=n;i++){ //i代表中间所有的整数//获取数字的阶乘getJc(i) //sum+=i;把所有数字加到sum sum+=getJc(i);//把所有数字的阶乘加到sum } return sum; } var res=getSum(5); console.log(res); |
4.2 变量作用域
(1) 作用域:变量或者函数可以访问的范围
函数作用域:在函数中使用var声明的变量,只能在函数内部访问,不能在外部访问到。
全局作用域:在全局作用域下声明的变量,可以在任意合法位置访问到。
注意:在函数内部使用var声明的变量是局部变量,不使用var声明的变量是全局变量
(2)变量的声明提升:
JS程序执行前,会将使用var关键字声明的变量提升到所在作用域的最前边(全局和函数),赋值还是在原来的位置
4.3 函数作用域
函数作用域:函数的课访问范围也分为全局作用域和函数作用域。
(1)函数声明的提升:
和声明变量提升一样,JS程序执行前,会将function创建的函数提升到所在作用域的最前边,调用可以在任意合法的位置
4.4 递归调用
递归:在函数内部调用自身
递归要有结束条件,结合return来使用。
练习:使用递归来计算1~任意数字之间的和 |
练习:使用递归来计算任意数字的阶乘。 |
function getSum(n){ //当n为1的时候。返回1 if(n==1){ return 1; } return n+getSum(n-1); } var res=getSum(4); console.log(res); |
|
1. 匿名函数
匿名函数:没有名称的函数 function () { ...}
(1)创建函数
函数声明方式:
function (){....} |
函数表达式方式:
var 函数名称=function(形参列表){ 函数体 } 调用 函数名称(); |
var fun=function(){ console.log(1); } fun(); |
对比fun和fun()的区别:
fun():是函数的调用;返回函数的调用结果
fun :是函数的名称,对应的是函数的整体结构
函数声明和函数表达式常见函数的区别:
函数声明存在函数提升,调用可以在任意合法位置
函数表达式不存在函数提升,只能先创建,再调用。
//练习:使用函数表达式创建函数,计算任意两个数字之间所有整数的和,并返回结果 |
var getSum=function(a,b){ for(var i=a,sum=0;i<=b;i++){ sum+=i; } return sum } console.log(getSum(1,2)); |
(2)匿名函数自调用
创建一个独立的函数作用域,防止污染全局。
全局污染:变量(函数)出现后会影响其它的使用
(function(形参列表){ 函数体; //函数体中的变量和创建的函数只能在内部使用 })(实参列表); |
(function(a){ var num=1; console.log(a); })(2); // 输出 2 |
(3)回调函数
回调函数:将匿名函数以实参形式传递,这个匿名函数就称为“回调函数”;此时的形参就是函数名称,如果要调用匿名函数,只需要 形参名称()
function fn(a){ //a 就是传递的匿名函数的名称 a(); // 执行传递的匿名函数函数体中的代码 } fn(function(){........}) |
function fn(a){ //调用函数的时候,实参赋给形参 //a=fn(function(){ return 1;}); //此时的a就是函数名称,如果要执行传递的匿名函数中函数体的代码,需要调用函数 var num=a(); console.log(num); } fn(function(){ return 3; }); |
//创建函数,传递两个参数,实参都是以匿名函数的形式传递,在匿名函数中分别返回数字,计算两个数字相加得到和并打印出来 |
function getSum(a,b){ var sum1=a(); var sum2=b(); console.log(sum1+sum2); } getSum(function(){ return 2; },function(){ return 1; }); |
2. 全局函数
parseInt() |
将数据转为整型 |
parseFloat() |
将数据转为浮点型 |
encodeURI() |
对一个URL中的中文进行编码 |
decodeURI() |
对已经编码的URL进行解码 |
isNaN() |
判断一个值是否为NaN ——> 是-> true/不是->false |
isFinite() |
判断一个值是否为有限值 ——> 是->true/不是->fale Infinity 无限值 |
eval() |
执行字符串中的表达式 ——> eval('1+1') ——>2 |