1、回调函数:将函数A传给函数B,由函数B来执行A,则称A为回调函数。
例1:
例2
1 function addone(a){return a+1;}; //定义一个回调函数 2 function mulitiply(a,b,c,callback) //定义一个可以调用回调函数的函数 3 { 4 var i,ar=new Array(); 5 for(i=0;i<3;i++) 6 { 7 ar[i]=callback(arguments[i]*2); //将输入参数乘以2之后作为回调函数的参数执行。 8 } 9 return ar; 10 } 11 var myarr=mulitiply(1,2,3,addone); 12 myarr; //[3, 5, 7]
改进代码,使其可以忽略输入参数个数。将代码修改后如下:
1 function addone(a){return a+1;}; //定义一个回调函数 2 function mulitiply(an) //定义一个可以调用回调函数的函数 3 { 4 var i,ar =new Array(arguments.length-1); 5 if (typeof arguments[arguments.length-1]==="function") 6 for(i=0;i<arguments.length-1;i++) 7 ar[i]=arguments[arguments.length-1](arguments[i]*2); //将输入参数乘以2之后作为回调函数的参数执行。 8 return ar; 9 } 10 var myarr=mulitiply(1,2,3,addone); //这种方式要求回调函数放在参数的最后一个 11 myarr; //[3, 5, 7] 12 var myarr=mulitiply(1,2,3,4,addone); //这种方式要求回调函数放在参数的最后一个 13 myarr; //[3, 5, 7, 9]
效果如图:
2、返回函数的函数:执行的函数返回值是一个函数引用。
1 function a() 2 { 3 function b() 4 { 5 return 'B'; 6 }; 7 return b; //返回一个函数的引用 8 } 9 var newfunct=a(); //获得一个函数的引用 10 typeof newfunct; //"function" 11 newfunct(); //"B" 12 a()(); //"B"; a()表示获取一个函数的引用,a()();表示执行获取引用的函数
3、重写自己的函数:将一个指向函数的变量指向另一个函数实现重写。
例1:
重写函数常常用于在一个函数执行时必须完成一些初始化工作,这样以后在调用函数就不必重复执行一些不必要的操作。
例2:
结果如下:
1 var a=function() 2 { 3 function init(){document.writeln('进行初始化工作<br/>');}; 4 function actuall(){ document.writeln('正式进行实际的操作<br/>');}; 5 init(); //执行初始化工作 6 return actuall; //返回函数引用 7 } (); //立即运行,变量 a 指向函数actuall
步骤分解如下:
在大函数内包含了两个小函数,其中 init 用于执行初始化函数,而大函数后面带了(),即大函数立即执行,首先执行了init初始化函数,再次将 actuall 函数的引用赋给了变量a,以后再调用 a 时,就只调用 actuall 函数,而不再执行 init 函数了。