在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。 --- 维基百科

一个公司会有自己的房子【一个函数有自己的作用域】。

公司会接收一些原料,进行一些处理,也会返回一些东西。【函数接收参数,进行处理,会有返回值】

外面的东西,是大家公有的,所以在公司内部也能用外面的东西。【函数内部能访问全局变量】

房子内的东西是公司自己的。只能在公司内使用,外面看不到也用不了。【局部变量是函数私有的,只能在函数内使用,外部无法访问】

公司里面可以开一些实验室,这个实验室是公司内部的,所以也可以使用公司内部的设备。【在函数A内部定义的函数B,可以访问函数A的局部变量】

一个公司完成其历史使命后,就没用了,会被拆迁,里面的私有的设备也会消失。【函数执行完后,会被GC回收,里面的局部变量也会消亡】

目前为止一切都看起来很正常,那么重点来了,如果公司最后给出的不是产品,而是把内部实验室丢出来成为另一个公司呢,会怎么样?

答案就是这个公司还是会被拆迁,但那些子公司需要用到的设备却不会被回收,因为子公司还需要。于是,这个子公司就是闭包,它在原来的公司倒闭前跑出来了,继续存活,还在原来公司的私有设备上贴了个标签说”这个设备我还要用,你把原公司的其他东西回收就好,这个不要回收掉”,于是拆迁大队GC就不会回收这个设备。

于是我们就实现了,在某公司倒闭后还能使用其设备。【在函数运行完后,还能通过某种方式访问它的局部变量,函数结束了,但局部变量还在,闭包的效果出现了】

也就是【闭包会使变量始终保存在内存中】或者说【闭包是由函数和与其相关的引用环境组合而成的实体】

注意事项

在一个公司内部创建十个子公司的时候,这些子公司只会在现有的设备上贴标签,也就是十个子公司会共享一个设备

像这样

for(var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}

结果就会输出10个10,而不是0-9。

就好比公司有个黑板i。

在黑板i写上0,然后创立一个内部的公司,让它在明天把这个黑板上写的东西发出去。

将黑板i上的0改成1,然后再创立一个内部的公司,让它在明天把这个黑板上写的东西发出去。

黑板i上的1改成2,然后再创立一个内部的公司,让它在明天把这个黑板上写的东西发出去。

……

一共创立了十个公司。

然后公司消亡了,但黑板i被留了下来,因为还有十个子公司还要用。

明天到了,十个子公司都去看黑板i,上面写了个“10”,于是他们都向外发出了 “10”。

所以怎么做呢

for(var i = 0; i < 10; i++) {
(function(e) {
setTimeout(function() {
console.log(e);
}, 1000);
})(i);
}

这样就不同了,每个子公司都有自己的黑板“e“(当然可以把子公司的黑板也命名为i,一样能用,就是看起来比较蛋疼)。

创立的时候就把公司的黑板i上的东西抄到自己的黑板上,等待明天发布。

于是十个子公司,都有自己的黑板,黑板上分别是他们创立的时候的黑板i上的内容,即使后面黑板i的内容变化了,但已经创立的子公司不会去管,他只管自己家的黑板e。

明天到了,十个子公司都发布了自家黑板e上的内容,也就是0-9,没人再去管原来的黑板i了。

差不多就是这样,更具体可以看详解js闭包  和 mozilla的闭包教程,这是讲得比较好的两篇。

我也是才开始学JavaScript,有什么理解错的,欢迎指出。

JavaScript之闭包就是个子公司的更多相关文章

  1. javascript中用闭包递归遍历树状数组

    做公司项目时,要求写一个方法,方法的参数为一个菜单数组集合和一个菜单id,菜单数组的格式为树状json,如下面所示: [{"id":28,"text":&quo ...

  2. JavaScript(8)--- 闭包

    JavaScript(8)--- 闭包 理解闭包 我的理解是:闭包就是能够读取其他函数内部变量的函数.由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以简单这样理解 &q ...

  3. 深入理解JavaScript的闭包特性如何给循环中的对象添加事件

    初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...

  4. JavaScript作用域闭包简述

    JavaScript作用域闭包简述 作用域 技术一般水平有限,有什么错的地方,望大家指正. 作用域就是变量起作用的范围.作用域包括全局作用域,函数作用域以块级作用域,ES6中的let和const可以形 ...

  5. JavaScript的闭包原理

    什么是js(JavaScript)的闭包原理,有什么作用? 一.定义 官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 个人的理解是 ...

  6. Js(javaScript)的闭包原理

    问题?什么是js(javaScript)的闭包原理,有什么作用? 一.定义 官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.  小编 ...

  7. 深入理解javascript的闭包

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域 ...

  8. 如何给循环中的对象添加事件--深入理解JavaScript的闭包特性

    初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...

  9. javascript,jquery(闭包概念)(转)

    偶尔听人说javascript闭包,让我联想起以前学编译原理和数字逻辑里讲的闭包,以前上课讲的闭包很难懂,而且含有递归的意思在里面,现在不想再查看里面的闭包概念. 但javascript我是经常要用, ...

随机推荐

  1. 原生JavaScript技巧

    时常在技术论坛有看见一些比较好的示例,于是就出于一种收集并学习的态度,于是就保留下来啦~  当然现在展示的也只是一部分,先放一部分出来尝尝鲜~~~

  2. PHP变量作用域(花括号、global、闭包)

    花括号 很多语言都以花括号作为作用域界限,PHP中只有函数的花括号才构成新的作用域. <?php if (True) { $a = 'var a'; } var_dump($a); for ($ ...

  3. word201612012

    I/O (input/output) port / 输入/输出端口 IAS, Internet Authentication Service / Internet 验证服务 ICMP, Interne ...

  4. CSS自适应布局(左右固定 中间自适应或者右侧固定 左侧自适应)

    经常在工作中或者在面试中会碰到这样的问题,比如我想要个布局 右侧固定宽度 左侧自适应 或者 三列布局 左右固定 中间自适应的问题. 下面我们分别来学习下,当然我也是总结下而已,有如以下方法: 一: 右 ...

  5. POI导出excel日期格式

    参考帖子: [1]http://www.ithao123.cn/content-2028409.html [2]http://javacrazyer.iteye.com/blog/894850 再读本 ...

  6. iOS整体框架类图

    Cocoa是OS X和iOS操作系统的程序的运行环境. iOS的操作系统层次结构分为四层:触摸UI层,媒体层,核心服务层,核心OS层.其中底层框架提供iOS的基本服务和技术,高层次框架简历在低层次框架 ...

  7. OC编程之道-创建对象之工厂方法

    一 何为工厂方法模式?(what) 定义创建对象的接口,让子类决定实例化哪一个类,工厂方法是的一个类的实例化延迟到其子类. 工厂方法创建的对象拥有一组共同的行为,所以往类层次结构中引入新的具体产品并不 ...

  8. 2. iOS程序的生命周期

    程序启动-生命周期 来自:  QQ: 853740091 1.首先讲解UIApplication对象 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个 ...

  9. .Net自带缓存Cache的使用

    对于数据比较大,经常要从数据库拿出来用的,可以考虑使用.Net自带的缓存Cache,简单好用: //向内存中插入一个缓存 System.Web.HttpRuntime.Cache.Insert(&qu ...

  10. oracle数据库安装完要做的事情。

    安装数据库客户端.这个在oracle官网可以下载安装(下载链接) 安装PL/SQL PL在下载 配置环境变量(这个比较重要,不配置PLSQL链接不到数据库) 配置的相关环境变量有: 变量名:oracl ...