javascript中的闭包是什么意思,闭包的定义

  javascript中的闭包是什么意思,闭包的定义

  什么是终结?让我们看看闭包有什么作用。下面这篇文章将带您讨论javascript中的闭包。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

  在前端学习的过程中,我们难免会遇到很多问题,所以今天我们就从一个初学者的角度来说两个问题:

  实际上,当我们学习javascript时,闭包无处不在。你只需要能够认识到并接受它。闭包不是一个需要学习新的语法或模式才能使用的工具。闭包是基于词法范围编写代码的自然结果。在编写代码时,我们几乎不需要刻意创建闭包。

  这个时候,相信很多朋友已经在嘀咕这个词法范围是什么了。别慌,慢慢听我说。简而言之,词法范围就是词法阶段定义的范围。换句话说,词法范围是由编写代码时编写变量和块级范围的位置决定的,因此当词法分析处理器处理代码时,范围将保持不变(大多数情况下都是这样)。—— 《你不知道的javascript上卷》

  先说个例子。

  功能测试(){

  var arr=[]

  for(var I=0;i10i ){

  arr[i]=function(){

  console.log(一);

  }

  }

  返回arr

  }

  var myArr=test()

  //myArr[0]()

  //myArr[1]()

  //.

  for(var j=0;j 10j ){

  myArr[j]()

  }

  //为了避免繁琐,这里用第二个循环调用测试函数第一个循环中的函数打印出十个结果。我相信这个时候有人会问,这和我们要讲的封闭有什么关系?如果稍微修改一下这段代码,改成累加器,怎么实现呢?

  但是今天我们讨论的是如何在ES5中实现累加器。那么我们来看下面的代码:

  功能测试(){

  var arr=[]

  for(var I=0;i10i ){

  (函数(j){

  arr[j]=function(){

  console . log(j);

  }

  })(一)

  }

  返回arr

  }

  var myArr=test()

  for(var j=0;j 10j ){

  myArr[j]()

  }细心的朋友一定会发现,这是将循环中的函数体改为自执行函数,但此时的输出结果是

  从0到9依次输出十个数字,其中包含闭包。当我们开始执行这段代码时,第二个for循环将被调用十次。当执行每个自执行函数时,将创建该自执行函数的AO对象。在这个自执行函数的AO对象中有一个名为J的属性。正常情况下,自执行函数被执行后,它的AO对象应该被销毁。但是,当执行myarr[j]()时,在作用域链顶端arr[j]的AO对象中找到了属性名J,但没有找到。是在自执行函数的AO对象中找到的,所以当自执行函数结束时,它的AO对象不会被垃圾回收机制回收,否则在执行myarr[j]()时会报错,此时会形成闭包。

  当前位置让我们再举一个例子。

  函数a(){

  函数b(){

  var bbb=234

  console . log(AAA);

  }

  var aaa=123

  B//b生于A,却被拯救。

  }

  var glob=100

  var demo=a()

  如果不从预编译的角度分析demo(),我们会认为aaa此时会报错。当执行var demo=a()时,应该销毁A对应的AO对象。照常分析。当我们执行demo时,作用域链此时应该会创建B的AO对象和GO对象。此时只有B的AO对象,没有A的AO对象,应该不会打印出aaa值,但此时aaa值为。原因是这里产生了闭包。当var demo=a()执行完毕,垃圾回收机制会问“一个函数老兄,我想你已经执行完毕了,你的运行内存可以给我释放了。但这个时候,一个函数只能摇头说:“兄弟,我不确定我执行完了没有。执行后创建了一个B,但是B不归我管,所以不确定B有没有。“所以我不确定我是否已经执行完了。垃圾收集机制已经考虑过了。既然你不知道,我就不回收了。如果我回收了一个还没完的东西,应该报错,所以这个时候A的AO对象还没有回收。

  

当一个函数被保存到了外部,将会产生闭包

  我相信通过这两个例子,你对闭包有了大致的了解。然后我们来说说闭包的功能。

  我们也举一个闭包(3.js)的函数的例子

  var计数=0

  函数add() {

  返回计数

  }

  console . log(add());

  console . log(add());

  console . log(add());这是一个比较常见的累加代码,但是如果公司让你在我们练习甚至工作的时候把累加器打包成一个模块化的代码,那么

  此时,为了模块化,我们尽量避免定义全局变量,但是不定义全局变量怎么实现呢?此时,我们可以使用封闭包;

  函数add() {

  var计数=0

  函数a() {

  数数

  console.log(计数);

  }

  返回a

  }

  var res=add()

  res()

  res()

  //add函数完成后,add的AO对象没有被销毁,因为ADD函数完成后,返回的A不知道是否被调用过,从而形成了闭包。

  它可以打包到一个模块化累加器中,而无需使用全局变量。

补充全面一点就是:当一个函数内部的函数被保存到函数外部时,就会产生闭包。

  以上是关于闭包及其功能的一些个人看法。目前对闭包只有一些粗浅的认识。经过后期的学习和改进,会有后续的关于闭包的文章。感谢观看,欢迎批评指正,共同进步。

  【相关推荐:javascript视频教程,web前端】以上就是什么是闭包?让我们来谈谈javascript中的闭包,看看它们是做什么的。更多详情请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: