第1页
JavaScript闭包你也懂
@snandy 2015.12
第2页
内容
闭包关键字
一句话闭包
闭包的3个关键知识点
闭包的深入理解
闭包代码赏析
第3页
闭包关键字
学术
晦涩
抽象
作用域链
函数嵌套
保持状态
第4页
一句话闭包
是 JavaScript 的一个难点但又功能强大,很多高级应用都要依靠它实现。
闭包是 JavaScript 的重要特性,是迈向高级 JavaScript 程序员的必经之路。
虽然不完全懂,或多或少也可以使用它。
闭包以很自然的形式,把我们的目的和所涉及的资源全给自动打包在一起。
闭包是代码块和创建该代码块的上下文中数据的结合。
闭包描述的函数执行过程中动态环境,是运行期的,动态的概念。
第5页
理解闭包的3个关键知识点
作用域链
静态/词法作用域
保持状态
第6页
作用域链
记住:内部函数可以访问到外部函数的变量。
第7页
静态/词法作用域
JavaScript 采用的是静态/词法作用域。
静态/词法作用域:函数在声明的时候就已经保存了其上层的作用域,而非调用的时候动态获取。
函数的外层上下文作用域,在函数声明是就已经确定了,和它在何处调用没有关系。
第8页
保持状态
返回内部函数
内部函数作为外部对象方法
第9页
闭包代码很简单
嵌套函数
内层函数使用外层函数的变量
内存函数引用暴露到外部
第10页
闭包的深入理解
变量对象
激活对象
第11页
变量对象
定义:一个VO[variable object]是关联上下文执行环境的一系列数据。它是与上下文关系密切的一个特殊对象,存储了在上下文中定义的变量和函数声明。
第12页
激活对象
定义:当一个函数被调用时,会创建一个 AO(activation object)。除了包含变量和函数声明外,它还包括参数和一个特殊的 arguments 对象。也可以把 AO 理解为函数上下文的 VO。
第13页
保存的“状态”是…
普通变量声明
函数声明
父级函数的参数
父级函数的 arguments 对象
第14页
闭包用途及代码赏析
实现私有成员
模块化,减少全局变量的污染
循环代码中正确找到对应元素的索引
写一个类库,比如jQuery,RequireJS
第15页
实现私有成员
第16页
模块化,减少全局变量的污染
第17页
循环代码中正确找到对应元素的索引
第18页
写一个类库,比如jQuery,RequireJS
第19页
资源
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures
https://en.wikipedia.org/wiki/Scope_(computer_science)#Lexical_scoping
https://en.wikipedia.org/wiki/Closure_(computer_programming)
http://stackoverflow.com/questions/111102/how-do-javascript-closures-work
http://jibbering.com/faq/notes/closures/
http://ejohn.org/apps/learn/#49
http://www.cnblogs.com/snandy/archive/2011/03/01/1967628.html
第20页
Thanks.