美文网首页
我对闭包的理解

我对闭包的理解

作者: 阿伦小宇 | 来源:发表于2018-01-12 16:22 被阅读0次

总结一句话:让一个局部变量能被外部环境引用到,从而这个局部变量不会被垃圾回收,就形成了闭包。
先上代码,一个最简单的闭包:

function f1(){
  var n = 0;
  function f2(){
    n++;
    return n;
  }
  return f2
}
var test = f1();
test() //1
test() //2

f1方法返回f2,f2方法中返回变量n,这样其实执行f1就是返回变量n了。可以把f1()当成一个变量。然后将这个变量负值给了test。正常来说局部变量n在执行完f1()后就会被垃圾回收,内存销魂掉。但是由于这一句:var test=f1(); 这个f1的局部变量n在外层被test引用了,所以垃圾回收机制不能销毁这个变量,一直保存在内存中。
所以现在第一步,执行test(),发生:局部变量n=0,加1,return出来1到外部。由于n被return到外部,也就是可以被外部环境引用到了,所以这个函数执行完后局部变量n不会被销毁,n=1还保存在内存中。
第二步,再执行test(),发生:局部变量n=1,加1,return出来2到外部,n=2会一直保存在内存中不会被销毁。
其实闭包之所以能存在,根本原因就是垃圾回收机制。这个机制也很简单不用长篇大论:在js中,函数执行完毕后,局部变量就会被销毁,内存中仅仅保存全局作用域。如果这个局部变量有被全局作用域引用,那这个局部变量则不会被销毁。这就是垃圾回收机制。
常用闭包的例子:

function closure() {   
  var pArray = document.getElementsByTagName("p");   
  for( var i=0; i<pArray.length; i++ ) {   
     (function(j){
        pArray[j].onclick = function() {   
          alert(j);   
        }  
      })(i) 
   }   
}  

(function(){
      function j() {} 
        j.prototype.hello = function(){
            alert('hello')
        }
        return window.j = new j();
})()

相关文章

  • 【js基础修炼之路】— 深入浅出理解闭包

    之前对于闭包的理解只是很肤浅的,只是浮于表面,这次深究了一下闭包,下面是我对闭包的理解。 什么是闭包? 引用高程里...

  • 我对闭包的理解

    总结一句话:让一个局部变量能被外部环境引用到,从而这个局部变量不会被垃圾回收,就形成了闭包。先上代码,一个最简单的...

  • 我对闭包的理解

    闭包:从字面意思来理解就是封闭和包裹,换句话说,就是在函数内部定义的变量,在函数的外部无法访问到,因此就说函数构成...

  • 闭包(Closure)

    我对闭包的理解 个人理解 : 闭包就是能够读取其他函数内部变量的函数。使用闭包主要是设计私有的方法和变量 优点:可...

  • 对闭包的理解

    一、变量的分类 1、局部变量和全局变量 注意:声明变量时不使用var,所声明的变量就是全局变量,即使是在函数内部声...

  • JS进阶系列之闭包

    我对闭包的理解就是:闭包就是能够读取其他函数内部变量的函数,可以把闭包简单理解为“定义在一个函数内部的函数”。 在...

  • Python中的闭包

    php对闭包的定义是匿名函数,我之前对python闭包的理解是:外部函数以内部函数作为返回值,称之为闭包!!!(错...

  • Gradle开发-Groovy闭包

    # 闭包 闭包的基础知识 闭包的使用 闭包 this,owner,delegate 的理解 总结 ## 闭包的基础...

  • 闭包

    这个问题也是必问的题目.重在把自己对闭包的理解表达出来.而我对闭包的理解是源于很久之前看阮一峰大师讲的闭包(clo...

  • Swift5 闭包及其应用

    关于如何理解闭包 学习闭包的第一个难点就是理解闭包,可能很多人用了很久的闭包都还不太清楚闭包到底是什么,我这里提供...

网友评论

      本文标题:我对闭包的理解

      本文链接:https://www.haomeiwen.com/subject/xgmfoxtx.html