闭包与递归

2019-12-12  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读