专栏首页QB杂货铺JavaScript之闭包就是个子公司

JavaScript之闭包就是个子公司

在计算机科学中,闭包(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,有什么理解错的,欢迎指出。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • shFlags简介

    看到有脚本中使用了shFlags,于是google了一下,发现还是个挺方便的东西。

    zqb_all
  • spinand之data buffer

    spinand一般会有一个内置的data buffer。 以W25N01GV为例,一个page是2048bytes外加64bytes的spare数据,其dat...

    zqb_all
  • 【swupdate文档 三】SWUpdate: 嵌入式系统的软件升级

    本项目被认为有助于从存储媒体或网络更新嵌入式系统。但是,它应该主要作为一个框架来考虑,在这个框架中可以方便地向应用程序添加更多的协议或安装程序(在SWUpdat...

    zqb_all
  • 微信移动端数据库组件 WCDB 系列:数据库修复三板斧(二)

    之前一篇文章《微信 SQLite 数据库修复实践》介绍了微信对SQLite数据库修复以及降低损坏率的实践, 这次再深入介绍一下微信数据库修复的具体方案和发展历程...

    微信终端开发团队
  • 一份超详细的「iOS 10 UI Kit」使用手册(附源文件)

    前言 Apple 早先于 WWDC 2016 发表了 iOS 10,而 Sketch 也推出了第 39 版,其中包含了一系列令人兴奋的新功能;我认为这对很多有意...

    前朝楚水
  • 几个实用技巧,值得你学习!

    有时候我们需要对图片进行排版,但是在Word中很难排版,那么我们可以利用表格来进行图片的布局。

    FreeRonin
  • 基于图卷积神经网络的城市轨道交通流量预测

    《Predicting Station-Level Short-Term Passenger Flow in a Citywide Metro Network ...

    深度学习与交通大数据
  • Python: 实际项目中抽象出的小项目设计Python: 一周笔记

    谢伟
  • 【java基础】Eclipse Java注释模板设置详解以及版权声明

    本文转载自:https://www.cnblogs.com/lr393993507/p/5867623.html

    用户5640963
  • 信息超新星的诞生

    image.png 推荐语: “信息能”这个提法让人耳目一新,它是信息革命的核心能源。正如蒸汽机推动了工业革命一样,“信息能”则推动了全球三十年来之...

    腾讯研究院

扫码关注云+社区

领取腾讯云代金券