一、回调函数
回调函数将一个函数做为参数传递给其他的函数供其使用
function callBack(){
}
setInterval(callBack,1000);
将callback放在setInterval定时器中,每隔1000毫秒执行一次callback函数,现在这个callback就叫做回调函数,因为它会在1000毫秒后回来调用它(回调)。回调函数是过会执行。
function callBack(){
}
setInterval(callBack(),1000);
不要写成setInterval(callBack(),1000),callBack()它是把callBack执行的结果进行回调,这里callBack没有执行的结果进行回调。
var i=0;
function fn1(f){
console.log("a");
f(fn1);
console.log(i);
}
function fn2(f){
i++;
console.log("b");
if(i < 3) f(fn2);
}
fn1(fn2);// a b a b a b 3 3 3
回调函数可以完成循环。
回调函数应用:红黄绿灯交换
function getLight(first,second,third){
}
function getRedLight(fn,fn1){
var f=arguments.callee;
var ids=setTimeout(function(){
console.log("红灯");
clearTimeout(ids);
fn(fn1,f);
},1000);
}
function getYellowLight(fn,fn1){
var f=arguments.callee;
var ids=setTimeout(function(){
console.log("黄灯");
clearTimeout(ids);
fn(fn1,f);
},1000);
}
function getGreenLight(fn,fn1){
var f=arguments.callee;
var ids=setTimeout(function(){
console.log("绿灯");
clearTimeout(ids);
fn(fn1,f);
},1000);
}
getRedLight(getYellowLight,getGreenLight);
二、递归函数
递归指在函数内部直接或者间接的调用自己
var obj={
a:{
a:{
a:{
a:{
a:null,
value:5
},
value:4
},
value:3
},
value:2
},
value:1
};
function showObj(o){
console.log(o.value);
if(o.a) showObj(o.a);// 满足条件进入递归
}
showObj(obj);
当希望遍历具备有深度数据结构时,通常使用递归或者while更为方便
当希望遍历具备广度数据结构时,一般使用for循环遍历
遍历 全部每个逐个查看
递归或者回调的次数过多,没有阻止递归或者回调的条件,会造成堆栈溢出。