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

一、常见的闭包

function outer() {var a = 1function 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
首先在代码执行前,会先创建一个全局的对象,其中包含着全局的属性,并且将其放入全局上下文作用域链顶端,并且也将其放入每一个函数的作用域链顶端。以这个例子为例。如图所示

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

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

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

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

此时函数执行中需要访问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

什么是闭包,闭包详解相关推荐

  1. 好程序员技术分析JavaScript闭包特性详解

    为什么80%的码农都做不了架构师?>>>    好程序员技术分析JavaScript闭包特性详解,今天来总结一下js闭包的那些事,以及遇到的坑和解决方法,希望对你有所帮助. 是的,没 ...

  2. colsure php_PHP Closure(闭包)类详解

    闭包就是能够读取其他函数内部变量的函数.例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成"定义在一个函数内部的函数".在本质上,闭包是将函数内 ...

  3. python值函数名的使用以及闭包,迭代器详解

    一.函数名的运用 函数名就是一个变量名,但它是一个特殊的变量名,是一个后面加括号可以执行函数的变量名. def func():print("我是一个小小的函数") a = func ...

  4. javascript中的闭包closure详解

    文章目录 简介 函数中的函数 Closure闭包 使用闭包实现private方法 闭包的Scope Chain 闭包常见的问题 闭包性能的问题 总结 简介 闭包closure是javascript中一 ...

  5. Python闭包(closure)详解

    阿巴阿巴阿巴,老Amy 来啦~由于闭包这家伙是块难啃得的骨头,所以 老Amy 就想着用一篇逐字稿帮助大家来搞定它! 首先,在 get 闭包这个知识点之前,我们已经知道了函数的作用域.那现在考考大家,思 ...

  6. php 中的闭包函数详解

    面向对象变成语言代码的复用主要采用继承来实现,而函数的复用,就是通过闭包来实现.这就是闭包的设计初衷. 注:PHP里面闭包函数是为了复用函数而设计的语言特性,如果在闭包函数里面访问指定域的变量,使用u ...

  7. Closure(闭包)类详解

    Closure 面向对象变成语言代码的复用主要采用继承来实现,而函数的复用,就是通过闭包来实现.这就是闭包的设计初衷. 注:PHP里面闭包函数是为了复用函数而设计的语言特性,如果在闭包函数里面访问指定 ...

  8. JavaScript闭包函数详解

    目录 闭包函数 变量作用域 闭包的概念 闭包的用途 闭包的缺点 闭包函数 变量作用域 要理解JavaScript闭包,就要先理解JavaScript的变量作用域. 变量的作用域有两种:全局的和局部的( ...

  9. python闭包详解函数_详解python函数的闭包问题(内部函数与外部函数详述)

    python函数的闭包问题(内嵌函数) >>> def func1(): ... print ('func1 running...') ... def func2(): ... pr ...

  10. php解析torrent文件,PHP基于闭包思想实现的BT(torrent)文件解析工具实例详解

    本文实例讲述了PHP基于闭包思想实现的torrent文件解析工具.分享给大家供大家参考,具体如下: PHP对静态词法域的支持有点奇怪,内部匿名函数必须在参数列表后面加上use关键字,显式的说明想要使用 ...

最新文章

  1. 【POJ1509】Glass Beads 【后缀自动机】
  2. 【转载】用三段 140 字符以内的代码生成一张 1024×1024 的图片
  3. 【动态规划】最长公共上升子序列
  4. excel简繁切换_EXCEL中如何随意切换简体繁体文字
  5. Java_输出60的十六进制
  6. Oracle.ManagedDataAccess 连接数据库用户名密码错误
  7. 线程启动语句的顺序是否决定线程的执行次序。_详细分析 Java 中启动线程的正确和错误方式
  8. GLSL中 Billboard和Point的顶点空间变换
  9. python3.7代码转python2.7_Python3.7与Python2.7在centos7下兼容并存
  10. 21世纪商业运作平台:云计算(Cloud Computing)
  11. php里面用魔术方法和匿名函数闭包函数动态的给类里面添加方法
  12. OpenLDAP 2.4.44 安装 + phpLDAPadmin 安装
  13. 使用BMfont制作含有中文图片的.fnt格式字体合图
  14. CSS颜色表示的几种方式
  15. 统计学中sp_用excel和sp和ss学统计学.doc
  16. 简单阻抗匹配电路及公式
  17. Word怎么转换成PDF?Speedpdf批量免费在线转换
  18. gamemaker学习笔记:拖拽
  19. 【转】Linux diff 命令详解
  20. 1第一个Chisel模块

热门文章

  1. Unity Addressable内存管理
  2. 零基础CSS入门教程(9)——背景颜色和背景图片
  3. 关于DBN fine-tunes使用BP多于up-down算法的一点看法
  4. 描述性统计分析——分布形态描述
  5. 聚米优选:为什么我的视频质量越来越好,却还是上不了热门?
  6. 物联网卡收费标准有哪些
  7. Ubuntu下cppcheck的安装和使用
  8. 内蒙古8项制度保障农牧民工工资支付
  9. mysql ignore into语法
  10. 茶室app开发为企业打造一个综合的共享经济服务平台