现在的位置: 首页 > 综合 > 正文

闭包知识点总结

2016年10月15日 ⁄ 综合 ⁄ 共 972字 ⁄ 字号 评论关闭

1. “在内部保存数据和对外无副作用”这两大特性在JavaScript中是通过“函数闭包”来实现的。

 

2. 函数与闭包:在JavaScript中函数只是一段静态的代码,脚本文件,因此它是一个代码书写时,以及编译器的,静态的概念;而闭包则是函数的代码在运行过程中的一个动态环境,是一个运行期的动态的概念。

 

3. 闭包的两个特点:第一是闭包作为与函数成对的数据,在函数执行过程中处于激活(即可访问)状态;第二是闭包在函数运行结束后,保持运行过程的最终数据状态。因此函数的闭包总的来说决定了两件事:闭包所对应的函数代码如何访问数据,以及闭包内的数据何时销毁。

 

4. 闭包包括的是函数运行实例的引用,环境(用来查找全局变量的表),以及一个由所有upvalue引用组成的数组。

 

5. 同一个函数代码块可以有多个函数实例,一个函数实例可以有多个函数引用。

 

6. 闭包是对应于运行期的函数实例的,而不是对应函数(代码块)的。

 

7. JavaScript中函数实例可能拥有多个闭包;函数实例与闭包的生存周期是分别管理的;函数被调用即“()”运算时总是初始化一个闭包,而上次调用中的闭包是否销毁,取决于该闭包中是否有被(其他闭包)引用的变量或数据。

 

8. 因为函数实例与闭包的生存周期是分别管理的,因此一个函数实例(以及其可能的引用)的生存周期,与闭包是没有直接关系的。换而言之,会存在函数变量没有持有闭包的情况。这是因为:闭包创建自函数执行开始之时,在执行中闭包没有被其他对象引用,在函数执行结束时闭包被销毁了,而这时函数实例及其引用都还存在,只是没有与之对应的闭包了。

 

9. 闭包内的标识符优先级:函数形式参数名>arguments>函数名。局部变量与函数形式参数名比较:当形式参数名与未赋值的局部变量名重复时,取形式参数名;当形式参数名与有值的局部变量名重复时,取局部变量值。

 

10. 函数闭包带来的可见性效果:变量在全局声明(用或不用var)则在全局可见;变量在代码任何位置隐式声明(不用var)则在全局可见;变量在函数内显式声明(用var)则在函数内可见,且在其所有的内嵌函数中可见(可见性传递),若在内嵌函数中重复声明某变量将覆盖当前可见的同名变量(可见性覆盖)。

 

11. 由于每一个函数实例都有一份ScriptObject的副本,因此不同的闭包访问到的私有变量会不一致。

抱歉!评论已关闭.