前言:
学习一门编程语言的基本步骤
(01)了解背景知识
(02)搭建开发环境
(03)语法规范
(04)常量和变量
(05)数据类型
(06)数据类型转换
(07)运算符
(08)逻辑结构
(09)函数
9.函数——function
1.函数
函数分为系统函数和自定义函数
JS提供的函数—isNaN/parseInt/parseFloat/Number/prompt...
function:功能体,函数(方法),能够接收若干个数据,返回处理结果。用于封装反复执行的代码。
1)建立一个普通函数
function 函数名称(){ //名字能够自定义
函数体 //要封装的代码
}
//调用
函数名称();前端
//function普通函数 function say(){ console.log("hello"); console.log("javaScript"); console.log("hello is me"); } say ();//调用函数打印上述文字 //练习:封装计算1-100之间1-100的和 function R(){ for (var i=1,sum=0;i<=100 ;i++ ){ sum+=i;//for循环运算 } console.log(sum);//最后是打印sum } R();//因此调用r以后打印sum,结果为5050
2)建立带有参数的函数 ——function-param
function 函数名称(参数列表){ //参数列表用于接受传递的数据
函数体;
}
//调用
函数名称(参数列表)//实际传递的数据
参数:建立函数时的参数成为形参,调用时参数成为实参,实参会赋值给形参,多个参数之间用逗号隔开。参数能够有0个或者多个,若是参数未被赋值,值为undefined。java
//function有参数函数 //计算任意两个数字相加的和 function add(var1,var2){//参数:形参——参数形式 console.log(var1+var2); } //调用 add(2,3);//参数:实参——实际接收的参数 //练习:建立函数,封装计算1-任意数字之间全部整数的和,调用屡次 function getsum(b){ for (i=1,sum=0; i<=b;i++ ){ sum+=i; } console.log(sum); } getsum(100); getsum(1004); getsum(10042); //练习:建立函数,封装计算任意两个年份之间闰年的个数,调用屡次 function runnian(year,year2){ for (i=year,count=0;i<=year2 ;i++ ){ if (i%4===0 && i%100!==0 || i%400===0 ){ count++; console.log(i,count); } } } runnian(1980,2000); runnian(1880,2100);
3)建立带有 返回值得函数——function-return
function 函数名称(参数列表){
函数体;
return 值;//返回值,函数执行完返回的结果
}
//调用
函数名称(参数列表)
注意事项: 若是函数中没有return,或是return 中没有加任何值,返回undefined;执行完return后的代码不会再执行。
return 函数:供外部使用的数据,return后面的数据不会被执行。 编程
//function带有返回值的函数 function add(n1,n2){ //返回n1+n2的结果,用于后期保存,能够理解为若是n1,n2若是有参数传进来以后就执行n1+n2,而后保存结果,以便于后续使用 return n1+n2; } //把函数的结果保存下来 var a=add(100,140); console.log("总成绩为:"+a); //练习:建立函数,传递任意年份,返回是否为闰年,若是是返回true,不是返回false;打印该年天数 function year(a){ if (a%4===0 && a%100!==0 || a%400===0){ return true; }//else { 能够省略 return false; } function getdays(a){ if(year(a)){//此处解释为若是year(a)为真就执行如下 return a+"闰年,366天"; }//此处省略else 不然 return a+"不是闰年,365天"; } console.log(getdays(2019));//2019不是闰年,365天 //练习:计算1-任何数字之间全部整数阶乘的和 //1!+2!+3!+4!+5! //步骤一:计算任意数字的阶乘n-1之间全部整数的乘积 function R(a){ for (var b=1,num=1;b<=a ; b++){ num*=b; } return num; } //R(4); //步骤2:计算1-n之间全部整数的和 function getSum(a){ for(var i=1,sum=0;i<=a;i++){ sum+=R(i); } return sum; } console.log(getSum(5));//153
总结:对比break和return的用法
break用于结束switch语句,还能够用于提早结束循环。
return用于在函数中的返回值,也能够结束函数后续代码执行。编程语言
2.做用域——scope
变量或者函数的可访问范围,分两种
全局做用域:在全局使用var声明的变量,能够在任意范围访问到,
函数做用域:在函数中使用var声明的变量,只能在函数内部访问到。函数
//做用域——scope //全局做用域下的变量 var a=1;//全局变量,在此处除function fn(){}函数之外就是全局。 //函数做用域下使用var声明的变量 function fn(){ var b=2;//局部变量 console.log(a);//全局函数a能够在任意范围访问 console.log(b);//2,局部变量能够在函数做用域内访问 } console.log(a);//1 fn();//1 调用函数,执行函数体代码。 console.log(b);//报错,b is not defined
注意事项:函数中不使用var声明的变量,默认是全局变量,能够在函数的外部访问,不推荐这样写。学习
//注意事项 function fn2(){ c=3;//函数中不使用var声明的变量默认是全局变量,不建议这么写,形成全局污染 } console.log(c);//即便c是包裹在函数内部,可是没有声明的变量默认是全局变量,因此在函数外部是能够访问的 fn2();//而调用fn2()的时候内部是什么都没有写的,至关于没有任何函数体代码
1)变量提高
JS程序执行前,会将使用var关键字声明的变量提高到所在做用域的最前边,可是赋值仍是在原来的位置。编码
//变量提高——全局做用域 var a=1;//声明变量并赋值 console.log(a); /***************** 实际在程序中应为 ****************/ //变量提高——全局做用域 var a;//声明提早 a=1;//var a=1中,声明提早,可是赋值留在原地 console.log(a); //变量提高——函数做用域 function fn(){ console.log(b); var b=2; } fn(); /***************** 实际在程序中应为 ****************/ //变量提高——函数做用域 function fn(){ var b;//变量提高到所在函数做用域前面 console.log(b);//此时只声明,没有赋值,因此打印结果是undefined b=2;//赋值留在原地, } fn();//因此调用后结果是undefined
2)函数的做用域
函数的可访问范围,在全局做用域下建立的函数能够在任意位置访问;在函数做用域下建立的函数只能在函数内部访问。spa
//函数做用域 var n=5,m=7; function fn2(){ //var n;提高到所在做用域最前面,至关于此处有一个声明变量,可是未赋值,只能在内部访问这个n console.log(n);//此时打印的n值为undefined,由于在函数做用域中var声明提早到做用域最前面, var n=8;//此处的至关于正常为 n=8 给前面声明的变量赋值, console.log(n);//此时打印的n值为8 console.log(m);//函数做用域内没有m,调用全局的m } console.log(n);//此处打印的n值是全局做用域下的n,值为5 fn2();//此处调用fn2
3)函数提高
和变量提高同样,JS程序执行前,会把function关键字建立的函数提高到坐在做用域的最前边,在调用的时候才会执行函数提高的代码。code
//函数提高 fn();//先调用, function fn(){ console.log(1); } /***************** 实际在程序中应为 ****************/ function fn(){//提高到当前做用域最前端,先建立 console.log(1); } fn();//调用
//建立函数——函数声明 function fn1(){ } var a;
//建立函数——函数表达式 //变量名称就是函数名称 var fn2=function(a,b){ console.log(a+b); } fn2(1,3); //练习:使用函数表达式建立函数,计算任意两个数字之间全部整数的和 //只能先建立在调用,由于不存在提高, var add=function(a,b){ for (i=1,sum=0;i<=b ;i++ ){ sum+=i; } return sum; } console.log(add(3,10));
2)匿名函数的自调用
目的:建立函数做用域包裹起来,防止污染全局。
(function(形参列表){
//函数体中的变量不能被外部访问
})(实参列表);blog
//匿名函数 //避免全局污染,把变量放到函数做用域下 (function(){//匿名函数能够本身调用本身函数内的数据,匿名函数须要用()() var num=2; console.log(num); })(); (function(a,b){//匿名函数能够本身调用本身函数内的数据,匿名函数须要用()() var num=4; console.log(a+b); })(3,5);
3)回调函数——callback
把匿名函数以实参的形式传递,意味着形参就是传递的匿名函数的名称
function fn(a){
//调用fn的时候,匿名函数赋值给参数a,a就是函数名称
a() //执行传递的匿名函数体中的代码。
}
//回调函数 function fn(a){ //实参赋值给形参 //把匿名函数赋值给a,a就是函数名称 //a=function(){ } a(); } fn(function(){ console.log(1); console.log(2); }); //调用函数a,执行传递的函数体中的代码 //练习:建立函数,传递两个参数,实参使用匿名函数的形式传递,在匿名函数的函数体中添加若干行代码;在函数中执行匿名函数中的代码。 function fun(a,b){ a(); b(); }; fun(function(){ console.log(3); },function(){ console.log(4); });
4.全局函数——global
parseInt()/parseFloat()/isNaN()/
encodeURI() 对网址中的汉字进行编码
decodeURI() 对已经编码网址进行解码
isFinite() 判断一个值是否为有限值,是—>true 不是-false
eval() 能够执行字符串中的表达式
//全局函数 //对一个网址中的中文编码 var str='http://www.jd.com/search?kw=电脑'; var str2=encodeURI(str); console.log(str2);//http://www.jd.com/search?kw=%E7%94%B5%E8%84%91 //对已经编码的网址进行解码 var str3=decodeURI(str2); console.log(str3);//http://www.jd.com/search?kw=电脑 //isFinite判断一个值是否为有限值。是—>true 不是-false //2/0-> Infinity(无穷) 0/2->0 console.log(0/2,2/0);//0 Infinity console.log(isFinite(1/3));//true //eval能够执行字符串中的表达式 console.log("1+2");//1+2 console.log(eval("1+2"));//3