一、函数的定义与调用
1.内置函数(parseFloat(),isNaN(' '),parseInt())
console.log(parseFloat('7.26e-2 ')); //返回:0.0726
console.log(isNaN(' ')); //判断是否是NaN:false
console.log(parseInt('15.99 ')); //返回:15
2.自定义函数(函数名可以由大小写字母、数字、下划线和$符号组成,但函数名不能以数字开头,也不能是JavaScript中的关键字)
function 函数名(参数1,参数2....){
函数体....
}
使用:
3.获取函数调用时传递的所有实参(通过arguments对象获取函数调用时传递的实参,实参总数通过length属性获取,具体参数可通过数组遍历的方式进行操作),代码演示:
function transferParam(){
console.log(arguments.length); //获取用户实际传递的参数数量
console.log(arguments); //控制台输出用户调用函数时传递的参数
}
4.含有默认值的参数与剩余参数
1) function great(name,say='Hi,I\'m'){
console.log(say+name);
}
2) 剩余参数(利用"...变量名"的方式动态地接受用户传递的不确定数量的实参),代码演示:
function transferParam(num1,...theNums){
theNums.unshift(num1); //在剩余参数数组的头部添加第一个参数
console.log(theNums); //在控制台输出用户调用函数时传递的参数
}
若定义transferParam()函数时,所有参数的数量都不确定,则可将上例修改为:
function transferParam(...theNums){
console.log(theNums);//在控制台输出用户调用函数时传递的参数
}
5.函数调用(使用参数名传入相应参数即可),代码演示:
结果:
二、变量的作用域
1)全局变量:不在任何函数内声明的变量(显示定义)或在函数内省略var声明的变量(隐式定义)都称为全局变量,它在同一个页面文件中的所有脚本内都可以使用.
2)局部变量:在函数体内利用var关键字定义的变量称为局部变量,它仅在该函数体内有效.
3)块级变量:ES6提供的let关键字声明的变量称为块级变量,仅在"{}"中有效.
代码演示:
结果:
三、匿名函数
1.函数表达式(将生命的函数赋值给一个变量,通过变量完成函数的调用和参数的传递),演示代码:
var fn=functioin sum(num1,num2){ //定义函数表达式,求和
return num1+num2;
}
fn(); //调用函数
注:函数表达式必须在调用之前,且调用时采用的是"变量名()"的方式,不能通过函数名称调用;函数声明的方式不限制定义与调用的顺序.
2.匿名函数(没有函数名称的函数,可以有效避免全局变量的污染以及函数名的冲突问题),演示代码:
var fn=function(num1,num2){ //函数表达式中省略函数名
return num1+num2;
};
fn(1,2);
(function(num1,num2){ //自调用方式
return num1+num2;
})(2,3);
document.body.onclick=function (){ //处理事件
alert('hi,everyone!');
};
3.箭头函数(介绍几种用法)
(a1,a2,...,aN)=>{statements} //标准语法
(a1,a2,...,aN)=>{return expression;}或(a1,a2,...,aN)=>expression //返回值
(singleParam)=>{statements;}或singleParam=>{statements;}//含有一个参数
()=>{statements;}或_=>(statements;)//无参箭头函数
具体示例:
var fn1=x=>x+2; //设置1个参数
console.log(fn1(4)); //输出结果:6
var fn2=(x,y)=>x+y; //设置2个参数
console.log(fn2(1,2)); //输出结果:3
注:"=>"不是操作符或者运算符,但箭头函数受操作符的优先级影响.
4.回调函数(指的是一个函数A作为参数传递给一个函数B,然后在B的函数体内调用函数A;此时称函数A为回调函数.匿名函数常用作函数的参数传递,实现回调),代码演示:
结果:
注:在函数中设置了回调函数后,可以根据调用时传递不同的参数,在函数体中特定的位置实现不同的功能.
5.介绍在JS中为数组提供的一些利用回调函数实现具体功能的方法:
find() 返回数组中满足回调函数的第一个元素的值,否则返回undefined
every() 测试数组的所有元素是否都通过了回调函数的测试
some() 测试数组的某些元素是否通过回调函数实现的测试
forEach() 对数组的每个元素执行一次提供的函数
map() 创建一个新数组,其结果是该数组中的每一个元素都调用一次提供的回调函数后返回的结果
reduce() 对累加器和数组中的每个元素(从左到右)应用一个函数,将其减少为单个值
reduceRight() 接收一个函数作为累加器(accumulator)和数组的每个值(从右到左)将其减少为单个值.
map()方法的使用
var arr=['a','b','c'];
arr.map(function(value,index){
console.log(value,index);
})
结果:第1次:"a 0",第2次:"b 1",第3次:"c 2"
arr.map()实现二维数组的转置
结果:
四、嵌套和递归
1.嵌套函数与作用域链:嵌套函数指的是在一个函数内部存在另- 个函数的声明。对于嵌套函数来言,内层函数只能在外层函数作用域内执行,在内层函数执行的过程中,若需要引入某个变量,首先会在当前作用域中寻找,若未找到,则继续向上一层级的作用域中寻找,直到全局作用域,我们称这种链式的查询关系为作用域链。
结果:
2.递归调用(指的是一个函数在其函数体内调用自身的过程,这种函数称为递归函数),代码演示:
结果(这里输入的值为:9):
3.闭包函数(所谓“闭包”指的是有权访问另一函数作用域内变量(局部变量)的函数),用途1)可以在函数外部读取函数内部的变量.2)可以让变量的值始终保持在内存中.
注:闭包函数会使得函数中的变量一直被保存在内存中,内存消耗很大,所以闭包的滥用可能会降低程序的处理速度,造成内存消耗等问题.
闭包函数实现:
结果: