菜鸟文章: 闭包和递归

74 阅读2分钟

1.闭包

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现, 闭包简单的理解就是一个作用域中访问另一个作用域中的变量. 一般情况是一种函数嵌套,内置函数访问外部函数的变量。构成闭包

闭包形成条件 (函数嵌套,内部函数调用外部函数的变量)

    /*
       闭包的形成条件
       1.函数嵌套
       2.内部函数调用外部函数变量
    */
​
​
    function fn(){
        let age  = 18;
        let myName = "鲁班";
​
         function fun(){
             console.log(age);
             console.log(myName);
         }
​
         fun();
    }
​
​
    fn();
​
​
    /*
      闭包就是一个对象  {key:value}
    */
​
​
​
   //将内部函数返回
​
    function fn(){
       let age = 20;
​
         return function (){
              
             console.log(age);
         }
    }
​
  let fn1 = fn();
  
  
​
  fn1();    //20     闭包的作用:延长变量的作用域链  

闭包小案例:

  function fn(){
        let count  = 0;
​
        return function(){
            count++;
            console.log(count);
        }
    }
​
    let fn1  = fn();
   
     fn1();  //1
     fn1();  //2
     fn1();  //3
     fn1();  //4
     fn1();  //5
     fn1();  //6
     fn1();  //7
​
    //由于作用域链延长   好处:局部变量 不影响全局但可以实现自增。  

闭包总结:

闭包的优点:

1.隐藏变量,避免全局污染

2.可以读取函数内部的变量

闭包的缺点:

1.导致变量不会被垃圾回收机制回收,造成内存消耗

2.不恰当的使用闭包可能会造成内存泄漏的问题

防止闭包造成内存泄漏

    window.addEventListener('load',function(){
​
        let btn  = document.querySelector(".btn");
        
        let value = btn.innerHTML;
        btn.addEventListener('click',function(){
                 
             console.log(value);
  
        })
​
        btn = null;
    })
​
//使用完 讲变量设置成null   等待下一次垃圾回收器回收。

闭包的应用

//形成一个沙箱环境。 模块化实现
​
(function(window){
    
      let name = "ztf";
      let age  = 10;
​
      function getName(){
          return name;
      };
​
      function getAge(){
          return age;
      }
​
​
      window.Info = {
          getName:getName
      }
    
​
})(window)

面试题1:

    function fn(){
         let a = 10;
        return (function(num){
             return num;
        })(a)
        
    }
​
  let fn1  =  fn();
​
  console.log(fn1);  ?

面试题2:

for (var i = 0; i < 3; i++) {
  setTimeout(function log() {
    console.log(i); // => ?
  }, 1000);
}

面试3:

function fun(n,o) {
  console.log(o)
  return {
    fun:function(m){
      return fun(m,n);
    }
  };
}
var a = fun(0);  a.fun(1);  a.fun(2);  a.fun(3);//undefined,?,?,?
var b = fun(0).fun(1).fun(2).fun(3);//undefined,?,?,?
var c = fun(0).fun(1);  c.fun(2);  c.fun(3);//undefined,?,?,?//答案:
//a: undefined,0,0,0
//b: undefined,0,1,2
//c: undefined,0,1,1