闭包是JavaScript的重要特性,非常强大,可用于执行复杂的计算,可并不容易理解,尤其是对之前从事面向对象编程的人来说,对 JavaScript 认识和编程显得更难。特别是在看一些开源的JavaScript代码时感觉尤其如此,跟看天书没什么区别。

一般情况下,人们认识一个事物,会根据之前的经验,进行对比和总结,在脑中建立一个模型,从而理解掌握它,但是JavaScript与面向对象编程实在“没有可比性”,最明显的是某过于写法,总觉得“怪怪的”,更不用说,其一些高级特性。如果说“对象”在面向对象编程时的出现相当有规律,但是在JavaScript中则毫无规律,无处不在,甚至在你意想不到的地方。

首先看两段代码。

示例 1:

示例 2:

示例1 和示例2都是闭包,只是2 比1复杂,甚至还有更复杂的写法,比如返回多个闭包。

示例 1,脚本被载入内存后,并没有为函数 sayHelloWorld()计算变量sMessage的值。该函数捕获 sMessage的值只是为了以后的使用,也就是说,解释程序知道在调用该函数时要检查 sMessage 的值。sMessage将在函数调用sayHelloWorld()时(最后一行)被赋值,显示消息"hello world"。

示例 2,函数addNum()包括函数doAdd() (闭包)。内部函数是一个闭包,因为它将获取外部函数的参数 iNum1和iNum2以及全局变量 iBaseNum的值。 addNum()的最后一步调用了doAdd(),把两个参数和全局变量相加,并返回它们的和。

这里要掌握的重要概念是,doAdd()函数根本不接受参数,它使用的值是从执行环境中获取的。

闭包,根据 ECMAScript 描述,词法(lexically)表示包括不被计算的变量的函数,函数可以使用函数之外定义的变量,它意味着当前作用域总能够访问外部作用域中的变量。函数是JavaScript中唯一拥有自身作用域的结构,因此闭包的创建依赖于函数。函数内部的函数访问其所在函数的变量(局部变量、形参),这些变量会受到内部函数的影响,当其外部函数外被调用时,就会形成闭包。内部的函数会在其外部函数返回后,被执行。

示例 3:

说明: foo 是bar的外部函数,ba 是foo的内部函数;a是foo的局部变量; bar 访问foo的局部变量 a; foo 返回bar。 bar在foo的外部被调用。 当执行 baz() 后,闭包使Javascript 垃圾回收机制不会回收foo所占的资源。因为,baz 实际指向foo的内部函数bar,bar依赖 foo的局部变量a。这样,在执行var baz=foo()后,baz实际指向了bar,而不是foo。bar访问了foo的局部变量a,当执行baz()后,a 为20。这就形成了一个闭包。

如果把foo看作是一个包,根据剪头指示,形成了一个闭包。结果是局部变量a的持久性(如示例 4 所示)。下面代码就不是闭包。无论执行多少次,都是显示 20。

参考自:http://www.toutiao.com/a6459693220359045645/?tt_from=weixin&utm_campaign=client_share&app=news_article&utm_source=weixin&iid=14394189501&utm_medium=toutiao_ios&wxshare_count=1

JavaScript中的闭包详解的更多相关文章

  1. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  2. (转)javascript中event对象详解

    原文:http://jiajiale.iteye.com/blog/195906 javascript中event对象详解          博客分类: javaScript JavaScriptCS ...

  3. 【JavaScript中的this详解】

    前言 this用法说难不难,有时候函数调用时,往往会搞不清楚this指向谁?那么,关于this的用法,你知道多少呢? 下面我来给大家整理一下关于this的详细分析,希望对大家有所帮助! this指向的 ...

  4. JavaScript中的this详解

    前言 this用法说难不难,有时候函数调用时,往往会搞不清楚this指向谁?那么,关于this的用法,你知道多少呢? 下面我来给大家整理一下关于this的详细分析,希望对大家有所帮助! this指向的 ...

  5. Javascript中prototype属性详解 (存)

    Javascript中prototype属性详解   在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不 ...

  6. PHP中的闭包详解

    PHP闭包(Closure)使用详解 作者: 字体:[增加 减小] 类型:转载 时间:2013-05-02我要评论 本篇文章介绍了,PHP闭包(Closure)的使用介绍,需要的朋友参考下   不知不 ...

  7. javascript系列2 -- 闭包详解

    转发请标明来源:http://www.cnblogs.com/johnhou/p/javascript.html  请尊重笔者的劳动成果  --John Hou 今天我们从内存结构上来讲解下 java ...

  8. JavaScript 中 this 的详解

    this 的指向 this 是 js 中定义的关键字,它自动定义于每一个函数域内,但是它的指向却让人很迷惑.在实际应用中,this 的指向大致可以分为以下四种情况. 原文作者:林鑫,作者博客:http ...

  9. javascript中this关键字详解

    不管学习什么知识,习惯于把自己所学习的知识列成一个list,会有助于我们理清思路,是一个很好的学习方法.强烈推荐. 以下篇幅有点长,希望读者耐心阅读. 以下内容会分为如下部分: 1.涵义 1.1:th ...

随机推荐

  1. spring mvc--默认都使用了哪些bean

    在MVC中默认使用的bean都定义在了 org.springframework.web.servlet下的DispatcherServlet.properties 下载源文件后可查看到默认bean定义 ...

  2. Voice Commands (VCD) Cortana 微软小娜示例

    Cortana 样品 您可以创建自定义功能Cortana使用Cortana技能装备或遗留的声音命令(VCD)平台. 在这里,你可以找到相关的样品: Cortana技能装备 目前Cortana技巧是建立 ...

  3. ES PS TS 流的区别

    http://fengqing888.blog.163.com/blog/static/330114162012111805717584/ ES是原始码流,包含视频.音频或数据的连续码流.TS是传输流 ...

  4. 网站banner图片制作(简易版)

    1.新建图层 根据baner需求,新建图层尺寸: 2.将图片拖进图层 按住shift对图片进行等比例缩放,将等比例缩放后的图片平铺到图层上. 3.添加文字 设置字体以及字体颜色 4.添加描边 选择文字 ...

  5. centos7 yum安装遇到报错:Head V3 RSA/SHA256 Signature, key ID 352c64e5: NOKEYer

    centos7 yum安装时遇到错误:Header V3 RSA/SHA256 Signature, key ID 352c64e5: NOKEY 无法安装时,可按如下方法解决: This mini ...

  6. ffmpeg Win8移植记(二)

    接着上回说,http://www.cnblogs.com/zjjcy/p/3384517.html 上回移植了ffmpeg在ARM上面,只是纯C的代码,没有做汇编的优化.因为ffmpeg的ARM汇编是 ...

  7. eclipse maven Cannot change version of project facet Dynamic web module to 3.0

      eclipse maven Cannot change version of project facet Dynamic web module to 3.0 (eclipse 修改maven项目的 ...

  8. 【VBA】点击工作簿中的每个单元格,整行整列变色

    需求描述 在点击单元格的时候,单元格所在行与列都变色显示 实现方案 打开Excle表格,按住ALT+F11 双击上图中的ThisWorkbook Private Sub Workbook_SheetS ...

  9. LeetCode-2: Add Two Numbers

    [Problem:2-Add Two Numbers] You are given two non-empty linked lists representing two non-negative i ...

  10. EMQ ---v2.3.11源码成熟度

    从原作者那边了解到,总体还可以,但是做不到99.99%稳定.主要是连接内存占用没有保护. pubsub均衡时很稳定,但是集群或大量消息向少量订阅发布时会崩溃,小概率情况. EMQ中CPU是公平分配给M ...