js闭包(上)

175 阅读3分钟
闭包是什么?
  • 定义在一个函数内部的函数 . 函数嵌套函数。子函数可以调用父函数的变量 父函数不能使用子函数的变量
  • 闭包函数就是外部函数被调用后,他的变量不会消失,仍然会被内部函数所使用,所有的内部函数都可以访问外部函数
  • 下面定义一个函数a 函数a里面还有个函数b 内部函数把自身参数m递加给外层函数变量n上 然后返回n的值外部函数a的返回值为内部函数b 形成闭包
 function a(){            //外层函数  即父函数 。闭包函数
       var n = 0;         //私有变量
       function b(m){     //内部函数  即子函数
            n= n+m;       //递加上级私有变量的值 
            return n;     //返回改变后的值
       }
       return b;          //返回子函数
    }
    var b = a();          //调用父函数 返回子函数
    console.log(b(3))     //输出3
    console.log(b(3000))  //3003
// 示例2
  function foo () {       //外部函数foo  
    var a = 2
    function bar () {     //内部函数bar
        console.log(a)  
    }
        return bar        //抛出内部函数bar
    }
    var baz = foo()       //调用外部函数 返回内部函数
    baz() //2
  • 函数bar的词法作用域可以访问foo的内部作用域,并且bar在被作为返回值赋值给baz执行时,
  • bar函数在定义时的词法作用域以外的地方被调用,依然可以访问foo函数的内部作用域变量a,就是闭包
  • 闭包可以访问到局部变量
  • 闭包有两个作用,一个是可以访问到局部变量,另一个就是让这些变量的值始终保持在内存中
//示例3
for (var i = 1; i <= 5; i++) {
    setTimeout(function() {
        console.log(i);  //6
    }, 10)
    }
    //setTimeout是个异步函数,所以会先把循环全部执行完毕,这时候i就是6 了,所以会输出一堆6  用闭包解决
    for (var i = 1; i <= 5; i++) {
    (function(j) {
        setTimeout(function timer() {
            console.log(j);  //1 2 3 4 5
        }, 10)
    })(i)
   }
//示例4
  • 闭包的定义很简单 函数 A 返回了一个函数 B,并且函数 B 中使用函数 A 的变量,函数 B 就被称为闭包。
function A() {
  let a = 1
  function B() {
      console.log(a)
  }
  return B
}

  • 形成闭包后,函数的执行空间不会被销毁,会一直存在。里面的变量也就不会被销毁。
  • 使用闭包主要是为了设计私有的方法和变量。
  • 优点是可以避免全局变量的污染;
  • 缺点是闭包会常驻内存,增加内存使用量,使用不当很容易造成内存泄漏。
  • 在JavaScript中,函数即闭包,只有函数才会产生作用域闭包有3个特性 (1)函数嵌套函数 (2)在函数内部可以引用外部的参数和变量 (3)参数和变量不会以垃圾回收机制回收
var  func = (function(){
      var i = 1; 
      return function () {
            console.log(i) 
      }
  })()   

作者git如果有错误或者不严谨的地方,请留言备注,十分感谢,对作者也是一种鼓励。