1. 闭包(closure), 指的是函数可以使用函数之外定义的变量。

2. 简单的闭包实例

2.1. 在JavaScript中使用全局变量是一个简单的闭包实例。请思考下面这段代码:

var message = "hello world";function sayHelloWorld() {alert(message);
}sayHelloWorld();

2.2. 在上面这段代码中, 脚本被载入内存后, 并没有为函数sayHelloWorld()计算变量message的值。该函数捕获message的值只是为了以后的使用, 也就是说, 解释程序知道在调用该函数时要检查message的值。message 将在函数调用sayHelloWorld()时执行到alert(message);这一行被赋值, 显示消息"hello world"。

3. 复杂的闭包

3.1. 在一个函数中定义另一个函数会使闭包变得更加复杂。例如:

var baseNum = 10;function addNum(num1, num2) {function doAdd() {return num1 + num2 + baseNum;}return doAdd();
}

3.2. 这里, 函数addNum()包括函数doAdd()(闭包)。内部函数是一个闭包, 因为它将获取外部函数的参数num1和num2以及全局变量baseNum的值。addNum()的最后一步调用了 doAdd(), 把两个参数和全局变量相加, 并返回它们的和。

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

4. 更为复杂的闭包

4.1. 代码

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="utf-8" /><title>闭包</title></head><body><script type="text/javascript">var myCounter = (function () {var counter = 0;return {increase: function() {return counter += 1;}, decrease: function() {return counter -= 1;}, clear: function() { return counter = 0;}};})();document.write('counter = ' + myCounter.increase() + '<br />');document.write('counter = ' + myCounter.increase() + '<br />');document.write('counter = ' + myCounter.increase() + '<br />');document.write('counter = ' + myCounter.decrease() + '<br />');document.write('counter = ' + myCounter.clear() + '<br />');document.write('counter = ' + myCounter.increase() + '<br />');</script></body>
</html>

4.2. 效果图

4.3. 例子解释

4.3.1. 变量myCounter的赋值是自调用函数的返回值。

4.3.2. 这个自调用函数只运行一次。它设置计数器变量为零(0), 并返回对象。

4.3.3. 这样myCounter成为了对象。最"精彩的"部分是它对象内部的函数访问父作用域中的计数器变量。

4.3.4. 闭包指的是有权访问父作用域的变量, 即使在父函数关闭之后。它使函数拥有"私有"变量成为可能。

061_JavaScript闭包相关推荐

  1. Python 闭包、单个装饰器、多个装饰器、装饰器修饰类、应用场景

    1. 闭包 在 Python 中,函数也可以作为参数.我们可以执行下面的代码: def func(a, b):return a + bprint(func) 我们直接输出函数名,而没有加括号.输出结果 ...

  2. Python 高级特性 (1)- 闭包

    1. 闭包的概念 在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包.闭包可以用来在一个函数与一组"私有"变量之间创建关联关系 ...

  3. [JS] 闭包与内存泄漏

    一句话总结闭包:函数里套函数,函数返回函数. 内存泄漏:每次外部函数执行的时候,外部函数的引用地址不同,都会重新创建一个新的地址.但凡是当前活动对象中有被内部子集引用的数据,那么这个时候,这个数据不删 ...

  4. php的闭包函数use的使用

    PHP在默认情况下,匿名函数不能调用所在代码块的上下文变量,而需要通过使用use关键字. function getMoney() {   $rmb = 1;   $dollar = 6;   $fun ...

  5. python之路-day11-迭代器闭包

    一 . 函数名的运用 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量. 1.函数名的内存地址 def func(): print("呵呵") print(fu ...

  6. 函数小知识点(文档字符串,闭包等)

    1 文档字符串(Documentation Strings) 一般被称为docstring,一款你应当使用的重要工具,它能够帮助你更好地记录程序并让其更加易于理解.令人惊叹的是,当程序实际运行时,我们 ...

  7. Go 学习笔记(18)— 函数(04)[闭包定义、闭包修改变量、闭包记忆效应、闭包实现生成器、闭包复制原对象指针]

    1. 闭包定义 Go 语言中闭包是引用了自由变量的函数,被引用的自由变量和函数一同存在,即使已经离开了自由变量的环境也不会被释放或者删除,在闭包中可以继续使用这个自由变量,因此,简单的说: 函数 + ...

  8. Python 精选笔试面试习题—类继承、方法对象、包管理、闭包、可变类型作为默认参数、列表引用、sort与sorted、 append 和 extend、深拷贝和浅拷贝

    1. 类继承 如下代码 class A(object):def show(self):print 'This is calss A'class B(A):def show(self):print 'T ...

  9. 读javascript高级程序设计03-函数表达式、闭包、私有变量

    一.函数声明和函数表达式 定义函数有两种方式:函数声明和函数表达式.它们之间一个重要的区别是函数提升. 1.函数声明会进行函数提升,所以函数调用在函数声明之前也不会报错: test(); functi ...

最新文章

  1. python爬虫入门教程-Python 爬虫介绍
  2. WGS84经纬度坐标转北京54高斯投影地方坐标流程
  3. 分享一下我的JAVA自学历程,加上我觉得效果还不错的方法
  4. Python版九九乘法表
  5. 使用枚举完成学生类,性别的设置。
  6. diy机器人图片 手绘纸箱_废物利用,她用几个纸箱让家里变成动物园,孩子回家乐坏了!收藏...
  7. PSD分层模板素材|电商页面这样设计,转化率成倍提高!
  8. 引用计数和AddRef、Release
  9. @Zabbix配置snmptrap及使用snmptt解析格式化输出
  10. java cropper_cropper 使用总结
  11. win7局域网拷贝其他计算机文件,局域网共享,教您win7局域网文件共享怎么设置
  12. 欢迎西南大学人工智能学院加入RICAI !!
  13. 最重要的100個英文字首字根 -- 字根 (3)
  14. SQLServer之修改PRIMARY KEY
  15. 服务器word文档会是只读的,WORD文档一保存就提示只读是什么原因
  16. 分享优秀品牌平面广告创意作品的创意密码
  17. 集成测试和单元测试覆盖率合并
  18. java多线程详解及线程池创建
  19. ubuntu20编译Gmssl时,“version OPENSSL_1_1_0d not defined”问题的较好解决办法
  20. Photoshop简单案例(8)——利用文字工具修改图片上文字

热门文章

  1. Windows7 VMware虚拟机安装Apple Mac OSX v10.7 Lion
  2. (转)所有iOS设备的屏幕分辨率
  3. laravel中Request、Session、Response、Middelware
  4. Django之入门 CMDB系统 (一) 基础环境
  5. cacti sendmail发送告警邮件
  6. 保护DNS对数字网络安全越来越重要—Vecloud
  7. 如何保护企业网络免受DDoS攻击?—Vecloud微云
  8. 关于leetcode第K个最大元素的几种解法
  9. Windows.Web.Http.HttpClient.GetStringAsync 总是返回相同的结果
  10. CIDetector 相册识别二维码出错