js中的回调函数和递归函数

820 阅读1分钟

一、回调函数

回调函数将一个函数做为参数传递给其他的函数供其使用

            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循环遍历
        遍历  全部每个逐个查看

递归或者回调的次数过多,没有阻止递归或者回调的条件,会造成堆栈溢出。