闭包1

<body>
  <!--
    1。如何产生闭包?
      *当一个嵌套的内部(子)函数引用嵌套的外部(父)函数的变量(函数)时,就产生了闭包
    2.闭包到底是什么?
      使用chrome调试查看
      理解一:闭包是嵌套的内部函数(绝大部分人)
      理解二:包含被引用变量(函数)的对象(极少数人)
      注意:闭包存在于嵌套的内部函数中
    3.产生闭包的条件?
      函数嵌套
      内部函数引用了外部函数的数据(变量/函数)



  -->


  <script>
  
    function fn1(){
      var a =2
      var b = '22'//闭包里面没有b
    如果是var fn = function(){ //这样就不产生闭包
      console.log(a)
      }
function fn2(){ //执行函数定义才能产生闭包(有函数提升),也就是一定要执行外部函数,执行了函数定义才会产生变量,不一定要执行内部函数(fn2) console.log(a) //闭包里面有a } fn2() } fn1() </script> </body>
执行函数定义才能产生闭包,也就是一定要执行外部函数,执行了函数定义才会产生变量,不一定要执行内部函数(fn2)

常见的闭包
<body>
  <!--

    1.将函数作为另一个函数的返回值
    2.将函数作为实参传递给另一个函数调用

  -->
  <script>
    //1.将函数作为另一个函数的返回值
    function fn1(){
      var a = 2
      function fn2(){
        a++;
        console.log(a)
      }
      return fn2
    }
    var f = fn1()  //闭包产生了
    f() //3     f是调用内部函数,不是外部函数
    f() //4
    //请问整个过程中创建几个内部函数对象?一个!!!  内部函数是执行函数,并不是创建函数
  
  //看闭包对象创建几个,就看你外部函数对象执行几次,因为创建外部函数对象,才会去创建内部函数对象,和内部函数执行几次没有关系,也就是和f()执行几次没有关系。因为执行外部函数时,执行了内部的函数定义,产生了变量。
    
   
//2.将函数作为实参传递给另一个函数调用

    function showDelay(msg,time){
      setTimeout(function(){
        alert(msg)
      },time)
    }
    showDelay('fds',2000)

    //内部函数function(){alert(msg)}闭包里面有msg,如果没有msg,就没有闭包


  </script>
  
</body>

闭包对象创建几个,就看你外部函数对象执行几次,因为创建外部函数对象,才会去创建内部函数对象,和内部函数执行几次没有关系,也就是和f()执行几次没有关系。因为执行外部函数时,执行了内部的函数定义,产生了变量。
 
posted @ 2019-10-22 11:22  燕子fly  阅读(135)  评论(0编辑  收藏  举报