你不知道的JavaScript(三)闭包
来源:互联网 发布:爱淘宝流氓软件 编辑:程序博客网 时间:2024/05/18 04:39
闭包是什么
函数即使在当前词法作用域外执行,也能够记住并访问函数定义所在的词法作用域,这就是闭包。(该定义来自于《你不知道的JavaScript》上卷,推荐阅读英文原版,中文版翻译不太准确)
对词法作用域不了解的可以阅读《你不知道的JavaScript》上卷第二章。
举个例子:
function foo() { var a=2; function bar() { console.log(a); } return bar;}var baz=foo();baz();//2
首先分析上述代码做了什么:
函数bar()
的词法作用域能够访问foo()
的内部作用域,bar()
函数本身被当做了一个值进行传递。
在foo()
执行后,返回值bar()
函数赋值给了变量baz
,然后调用了baz()
。
上述过程的实质其实就是通过不同的标识符(foo()
和baz()
)引用调用了内部的函数bar()
,它在自己的词法作用域(foo()内部
)以外的地方(全局作用局)执行,但是依旧可以访问其所在的词法作用域(依然可以访问变量a),这就是闭包。
在foo()
执行完毕后,通常foo()
的整个内部作用域会被销毁,因为引擎有垃圾回收机制来释放不再使用的内存空间。由于看上去foo()
的内容不会再被使用,所以自然要对其进行回收。
但是闭包会阻止这件事的发生。事实上,bar()
保持着对内部作用域的访问权限,所以内部作用域依旧处于使用状态,因此不会被销毁。
不论对函数类型的值以何种方式进行传递,只要函数能在别处被调用,就会产生闭包。例如:
function foo() { var a=2; function baz() { console.log(a); } bar(baz);}function bar(fn) { fn();}
上述代码将内部函数baz
传递给bar
,当调用这个内部函数时,它能够访问a,这也是闭包。
阅读全文
0 0
- 你不知道的JavaScript(三)闭包
- 你不知道的javascript(三)
- 你不知道的JavaScript--Item10 闭包(closure)
- 你不知道的JavaScript(三)字符串
- 你不知道的javascript(一)
- 你不知道的javascript(二)
- 你不知道的javascript(四)
- 你不知道的javascript(六)
- 你不知道的JavaScript (上)
- 你不知道的JavaScript (上)
- 你不知道的 Javascript
- 你不知道的 Javascript
- 关于作用域和闭包——源自《你所不知道的JavaScript》
- 你不知道的JavaScript 上卷 第一部分 作用域和闭包
- JavaScript提升(你不知道的JavaScript)
- JavaScript词法作用域(你不知道的JavaScript)
- JavaScript作用域闭包(你不知道的JavaScript)
- JavaScript中的this(你不知道的JavaScript)
- 代码问题—IRGAN_baseline
- python一道关于颠倒字典中键值的问题
- HTTP缓存机制
- 《Android源码设计模式解析与实战》读书笔记全集
- yii常用的一些操作调用
- 你不知道的JavaScript(三)闭包
- 04.21 三剑客之老大awk命令详解
- 基于window&&基于Linux的yum源安装
- [LeetCode] 561. Array Partition I
- Apache 2.4 + Tomcat7集群配置
- dmesg
- 在507干活的第3天(上)
- 1. Git安装与配置
- VC实现对话框客户区透明!