美文网首页
闭包与递归

闭包与递归

作者: 又菜又爱分享的小肖 | 来源:发表于2019-12-12 20:47 被阅读0次

    1.什么是闭包

    搞这些只为提高自己的记忆力,以后会不定期的发布
    声明在函数内部,可以访问函数内部的局部变量的一个函数

    01.第一种表现形式

    function test(){
        var num = 10;
        function test2(){
            console.log(num);
        }
        return test2;
    }
    var fn = test(); //调用test函数,有一个返回值,返回值是函数.  
    fn();//那调用fn其实就是在调用这个test2
    

    02.第二种表现形式

    var fn2 = (function(){
        var num1 = 100;
        function inner(){
            console.log(num1);
        }
        return inner;
    }());
    fn2(); //这里调用fn2本质上也是在调用inner
    

    2.闭包的作用?

    01.提升变量的生命周期
    就是说可以在函数外部访问函数内部的局部变量

            //局部变量:从声明他开始到那个函数执行完毕,结束啦
            //全局变量:从声明出来开始,到程序结束(页面关闭)
            function test(){
                var num=10;
                console.log('嘻嘻');//嘻嘻
               console.log('爱你');//爱你
                console.log(num);//10
                console.log('嘿嘿')//嘿嘿
            }
            test();
            console.log(num)//报错了,因为该变量被回收了
    
            //提升变量的生命周期
            function test(){
                var num=10;
                function test2(){
                    console.log(num);
                }
                return test2;
            }
            var ha=test();//test()相当于test2函数,赋值给ha
            ha();//相当于调用test2函数
    

    02.提供有限的访问权
    03.设置私有属性

    3.沙箱/沙盒

    01.作用:分割作用域,避免全局变量污染 模块化开发

                var list=[];
                function Boss(){
    
                }
                //为什么不能在这个自执行函数里面直接使用window,而是非要传参进来使用??
                //1.直接使用会破坏函数的封装性
                //2.代码上线之前会有代码压缩,为了避免压缩过程中出问题
                w.Boss=Boss;
                w.Boss1=Boss1;
            }(window));
    

    4.函数执行的三种方式-this的指向

    口诀:不要管函数/方法是如何声明的,要看函数/方法是如何调用,谁调用,里面的this就是谁
    1.作为普通函数调用--this指向window

    function test(){
             console.log('test');
             console.log(this);
         }
         test();//指向window
    
    snipaste_20191212_201712.png

    2.作为方法调用--指向obj对象

         var num='数字';//声明一个全局变量,本质上相当于给window对象添加一个属性
         var obj={
             name:'家家',
             sayHi:function(){
                 console.log('哈哈哈');
                 console.log(this);
             }
         }
         obj.sayHi();//调用
    
    snipaste_20191212_202203.png

    3.作为构造函数调用

    function Student(name, age) {
        this.name = name;
        this.age = age;
        console.log(this);
    }
    
    //3.1 构造函数配合new关键字调用,this是new关键字创建出来的对象. 
    var s1 = new Student('加哥',20); 
    
    //3.2 
    Student('哈哈',66); //相当于是window.Student('哈哈',66)
    
    snipaste_20191212_202812.png

    2.什么是递归?

    1.函数在函数内部调用自己
    注意:一定要有结束的条件,不然无意义

          //在函数内部直接调用自己
    function test(){
       console.log('嘿嘿');
       test();//调用自己
    }
    test();
    
    //函数内部间接调用函数自己
    function test1(){
       console.log('test1');
       test2();//test1里面调用test2
    }
    function test2(){
       console.log('test2');
       test1();//test2里面又调用test1,那就感觉test1里面调用test1
    }
    test1();
    
    //注意: 递归结束的时候,要有条件结束
    let i = 0;
    function test(){
       i++;
       console.log('哈哈');
       if(i < 3){
           test();//当i小于3的时候才会继续在test函数中调用test函数. 
       }
    }
    
    test();
    

    2.递归的执行过程

    let i=0;//声明全局变量
     function test(){
         i++;
         console.log('哈哈'+i)
         if(i<3){//条件为小于3结束
            test();//调用自己
         }
         console.log('呵呵'+i);
     }
     test();
    

    结果:


    snipaste_20191212_204012.png

    过程:


    递归执行过程01.png

    相关文章

      网友评论

          本文标题:闭包与递归

          本文链接:https://www.haomeiwen.com/subject/uootnctx.html