061_JavaScript闭包
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闭包相关推荐
- Python 闭包、单个装饰器、多个装饰器、装饰器修饰类、应用场景
1. 闭包 在 Python 中,函数也可以作为参数.我们可以执行下面的代码: def func(a, b):return a + bprint(func) 我们直接输出函数名,而没有加括号.输出结果 ...
- Python 高级特性 (1)- 闭包
1. 闭包的概念 在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包.闭包可以用来在一个函数与一组"私有"变量之间创建关联关系 ...
- [JS] 闭包与内存泄漏
一句话总结闭包:函数里套函数,函数返回函数. 内存泄漏:每次外部函数执行的时候,外部函数的引用地址不同,都会重新创建一个新的地址.但凡是当前活动对象中有被内部子集引用的数据,那么这个时候,这个数据不删 ...
- php的闭包函数use的使用
PHP在默认情况下,匿名函数不能调用所在代码块的上下文变量,而需要通过使用use关键字. function getMoney() { $rmb = 1; $dollar = 6; $fun ...
- python之路-day11-迭代器闭包
一 . 函数名的运用 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量. 1.函数名的内存地址 def func(): print("呵呵") print(fu ...
- 函数小知识点(文档字符串,闭包等)
1 文档字符串(Documentation Strings) 一般被称为docstring,一款你应当使用的重要工具,它能够帮助你更好地记录程序并让其更加易于理解.令人惊叹的是,当程序实际运行时,我们 ...
- Go 学习笔记(18)— 函数(04)[闭包定义、闭包修改变量、闭包记忆效应、闭包实现生成器、闭包复制原对象指针]
1. 闭包定义 Go 语言中闭包是引用了自由变量的函数,被引用的自由变量和函数一同存在,即使已经离开了自由变量的环境也不会被释放或者删除,在闭包中可以继续使用这个自由变量,因此,简单的说: 函数 + ...
- 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 ...
- 读javascript高级程序设计03-函数表达式、闭包、私有变量
一.函数声明和函数表达式 定义函数有两种方式:函数声明和函数表达式.它们之间一个重要的区别是函数提升. 1.函数声明会进行函数提升,所以函数调用在函数声明之前也不会报错: test(); functi ...
最新文章
- python爬虫入门教程-Python 爬虫介绍
- WGS84经纬度坐标转北京54高斯投影地方坐标流程
- 分享一下我的JAVA自学历程,加上我觉得效果还不错的方法
- Python版九九乘法表
- 使用枚举完成学生类,性别的设置。
- diy机器人图片 手绘纸箱_废物利用,她用几个纸箱让家里变成动物园,孩子回家乐坏了!收藏...
- PSD分层模板素材|电商页面这样设计,转化率成倍提高!
- 引用计数和AddRef、Release
- @Zabbix配置snmptrap及使用snmptt解析格式化输出
- java cropper_cropper 使用总结
- win7局域网拷贝其他计算机文件,局域网共享,教您win7局域网文件共享怎么设置
- 欢迎西南大学人工智能学院加入RICAI !!
- 最重要的100個英文字首字根 -- 字根 (3)
- SQLServer之修改PRIMARY KEY
- 服务器word文档会是只读的,WORD文档一保存就提示只读是什么原因
- 分享优秀品牌平面广告创意作品的创意密码
- 集成测试和单元测试覆盖率合并
- java多线程详解及线程池创建
- ubuntu20编译Gmssl时,“version OPENSSL_1_1_0d not defined”问题的较好解决办法
- Photoshop简单案例(8)——利用文字工具修改图片上文字
热门文章
- Windows7 VMware虚拟机安装Apple Mac OSX v10.7 Lion
- (转)所有iOS设备的屏幕分辨率
- laravel中Request、Session、Response、Middelware
- Django之入门 CMDB系统 (一) 基础环境
- cacti sendmail发送告警邮件
- 保护DNS对数字网络安全越来越重要—Vecloud
- 如何保护企业网络免受DDoS攻击?—Vecloud微云
- 关于leetcode第K个最大元素的几种解法
- Windows.Web.Http.HttpClient.GetStringAsync 总是返回相同的结果
- CIDetector 相册识别二维码出错