在编程的世界里函数无处不在,任何语言里都是一个核心的概念。
所以对函数的认知和掌握就显得非常重要。
我总结了我自己学习函数的知识点:
- 函数的定义和调用
- 回调函数
- 自调函数
- 内嵌函数
- 以函数为返回值的函数
- 重定义自身的函数
- 闭包
一 函数的定义和调用
函数的定义 有两种方式 一种就是函数的声明 另一种就是函数表达式。
下面我们来看一下函数的两种定义:
//函数的声明
function f(a,b){
return a+b;
}
//函数表达式 (function expression)
var add = function(a,b){
return a +b;
}//function 部分 又称匿名函数
调用函数声明时直接函数名称 +()里的参数就行了比如上面函数的调用:
f(3,4) //7
add(3,4) //7
二 回调函数
1.通过函数表达式 我们知道函数可以赋值给变量,既然可以赋值 我们试试把函数当作参数传递呢?尝试一下吧
首先我们得定义一个以两个函数为参数的函数 并求他们的返回值之和
function funAdd (a,b){
return a() +b();
}
//定义两个函数
function first {
return 1;
}
function sencond {
reuturn 2;
}
//first和sencond当作参数传递给funAdd
funAdd(first,sencond); //3
事实上,我们可以用匿名函数来代替first和second两个函数
function funAdd {
function(){return 1;},function(){return 2;}
}
2.那么什么是回调函数呢?
当函数A传递给函数B时,并且有B来执行A时,此时函数A就是回调函数(callback functions),如果函数A是一个无名函数 此时函数A就是匿名回调函数。
在编程语言的开发中,我们常常需要将一个函数返回值传递给另一个函数。
所以我们先写两个函数
function one (a,b,c){
var i ,ar =[];
for (i= 0 ;i<3;i++){
ar[i] = arguments[i]*2;
}
return ar;
}//循环将三个参数分别乘以2 并且以数组的方式返回ar;
function two(a){
return a+1;
}//只接受一个参数 且+1返回
alert(one(1,2,3)); //2,4 ,6
alert(two(1)); //2
//测试一下,没有问题0-0
现在我们要将one函数 三个参数传递给two函数
var myarr =[];
myarr =one(1,2,3)
//先存储在myarr 数组里 然后循环遍历给two函数
for(var i = 0;i<3;i++){
myarr[i] = two(myarr[i]);
}
alert(myarr);//3,5,7
很显然,代码有点过多 我们得像办法想让代码量减少一点。既然想减少代码量 我们就看看代码有哪些共同的部分? 上述代码 一眼看到两个for循环
这显然有点多余,我们得让他合并调
既然函数可以传递所以我们把two 函数作为参数放进one 传递
所以我们修改一下one 函数
function one (a,b,c,callback){
var i ,ar =[];
for (i= 0;i<3;i++){
ar[i] =callback(arguments[i]*2);
}
return ar;
}
myarr = one(11,22,33,two);
alert(myarr); //23 45 ,67
我们还可以通过匿名函数来代替two()
myarr = one(1,2,3,function(a){
return a+2;
})
alert(myarr) //4,6,8
3,总结使用回调函数的好处
- 可以不使用命名的情况,传递函数(节省全局变量)
- 一个函数的调用操作委托给另一个函数(减少代码工作量)
- 有助于提升性能(尤其是匿名回调函数)