关于对闭包的理解

98 阅读1分钟

上个例子

  //(1)
  var a = '全局变量a'
  function firtFunction() {
    console.log(a); //全局变量a
  }

  function secondFuntion() {
    let a ='局部变量a'
    firtFunction() 
  }
  secondFuntion()  //打印的  a==?

# 再举个栗子 
  //(2)
   function outer() {
    let num = 0
    return function inner() {
      num += 1
      console.log(num);
    }
  }
  var out = outer()
  out() //1
  out() //2
  
  console.log(out); //这里是打印out函数 不是执行
  // ƒ inner() {
  //     num += 1
  //     console.log(num);
  //   }
   
  //第一个栗子的结果:在secondFuntion函数里面的firtFunction()  ====>输出全局变量a
  
  // 这里firtFunction()定义在了全局--所以执行的时候会去全局寻找变量a   定义的时候就决定了他的一生
   
   //解释第2个栗子
   **inner函数定义时所处的作用域在outer函数里,根据作用域链找到了outer函数里面定义的num**
  
   所以当out函数执行的时候会调用inner函数(看上方outer函数打印),而inner函数使用的是他定义的时候就找到的
   outer函数里面的num,所以会每次+1  
   
   突破点:实际上out()执行的时候执行的是inner()函数 
   
    //(类比 firtFunction定义在全局 它里面的a根据作用域链找到了全局a
   // 那么即便secondFunction里面调用了firstFunction() 它依然是打印全局a。
   //定义的时候就决定了他的一生)
   
附加:闭包三大条件:
1.函数嵌套
2.内部函数使用外部函数变量
3.内部函数作为返回值。