让我们一起来学习一下什么是javascript的闭包

作者:卖菜的小白 时间:2024-04-17 10:11:43 

什么是闭包:
闭包是一个存在内部函数的引用关系。
该引用指向的是外部函数的局部变量对象(前提是内部函数使用了外部函数的局部变量)
闭包的作用:
延长外部函数变量对象的生命周期
使用闭包能够间接的从函数外部访问函数内部的私有变量

一、常见的闭包

function outer() {
 var a = 1
 function inner() {
   console.log(a)    //1
 }
 inner()
}
outer()

二、实例详解

function createFunc() {
 var result = new Array()
 for (var i = 0; i < 10; i++) {
   result[i] = function () {
     console.log(i)
   }
 }
 return result
}
var result = createFunc()
result[0]() //10
result[1]() //10
result[2]() //10
result[3]() //10
result[4]() //10
result[5]() //10
result[6]() //10
result[7]() //10

首先在代码执行前,会先创建一个全局的对象,其中包含着全局的属性,并且将其放入全局上下文作用域链顶端,并且也将其放入每一个函数的作用域链顶端。以这个例子为例。如图所示 

让我们一起来学习一下什么是javascript的闭包

在初始化结束后,开始执行代码,此时就会创建一个新的对象,叫做Active Object,其中放入一些参数,并且将其压入createFunc函数的作用域链中。 

让我们一起来学习一下什么是javascript的闭包

因为在createFunc中仍然定义函数result[i]..,所以在执行代码前,该函数会形成作用域链。 

让我们一起来学习一下什么是javascript的闭包

此时开始执行createFunc函数,当指向完毕后,createFunc中的作用域链表现为。如下图所示。此时result为一个数组。并且Active object已经从createFunc作用域链的顶部删除。 

让我们一起来学习一下什么是javascript的闭包

此时开始执行result[0](这里以result[0]为例,其他的一样),此时执行result[0]之前,应该创建一个新的Active object对象,将其放入result[0]执行作用域栈中。如图所示

让我们一起来学习一下什么是javascript的闭包

此时函数执行中需要访问i,但是在active object并不存在i,所以此时需要沿着作用域链进行查找,在createFunc中找到i,并且i的值为10,所以最终打印的值都是10。在createFunc执行完毕后,其创建的对象并没有被垃圾回收掉,因为在result[0]中的i依然保持对该对象的引用。 

这个例子的解决方法如下所示,就是设置一个立即执行函数,每一个下标对应的函数,都是立即执行函数,当立即执行函数执行时,每一个函数的上下文对象中都会存在为正确的下标值。

function createFunc() {
 var result = new Array()
 for (var i = 0; i < 10; i++) {
   result[i] = (function (num) {
     return function() {
       console.log(num)
     }
   })(i)
 }
 return result
}
var result = createFunc()
result[0]() //0
result[1]() //1
result[2]() //2
result[3]() //3
result[4]() //4
result[5]() //5
result[6]() //6
result[7]() //7

来源:https://blog.csdn.net/weixin_47450807/article/details/122658007

标签:javascript,闭包
0
投稿

猜你喜欢

  • 超越MYSQL,ACCESS复合承载

    2008-12-09 13:31:00
  • Python的函数嵌套的使用方法

    2022-03-23 10:28:54
  • [翻译]标记语言和样式手册 Chapter 8 再谈清单

    2008-01-29 13:16:00
  • JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)

    2024-04-17 09:52:06
  • Python SSL证书验证问题解决方案

    2022-11-06 13:54:35
  • python3 使用openpyxl将mysql数据写入xlsx的操作

    2024-01-25 14:58:23
  • asp多关键词查询方案

    2008-05-09 12:24:00
  • Mysql的数据库迁移到另一个机器上的方法详解

    2024-01-16 18:33:24
  • python用opencv完成图像分割并进行目标物的提取

    2023-12-04 21:31:29
  • Select的OnChange()事件

    2009-03-03 12:40:00
  • javaScript产生随机数的用法小结

    2024-04-17 10:40:20
  • Python unittest单元测试框架实现参数化

    2022-11-01 18:29:48
  • Python面向对象类的继承实例详解

    2023-04-19 11:06:38
  • js关于 byval 与 byref 的区别

    2007-10-13 10:48:00
  • golang中tar压缩和解压文件详情

    2024-05-10 13:58:46
  • 名片管理系统python版

    2021-08-06 01:50:15
  • 关于msyql事务隔离你要知道

    2024-01-27 11:07:31
  • Python3 使用pip安装git并获取Yahoo金融数据的操作

    2023-11-17 21:56:48
  • Python3连接Mysql8.0遇到的问题及处理步骤

    2024-01-20 13:06:46
  • 基于Python实现火车票抢票软件

    2021-08-28 18:31:08
  • asp之家 网络编程 m.aspxhome.com