这段在看一本书,《编写高质量的代码》之改善JavaScript的188个建议,感觉还不错,
写点儿笔记吧。
今天再来说说,使用闭包的问题。
闭包函数能够使用函数外定义的变量。其中它有两个特性,一个是封闭性,另一个则是持久性。封闭性体现在
外界无法访问闭包内部ude数据,如果在闭包内声明变量,外界是无法访问的,除非闭包主动给外界提供接口;
而持久性,则体现在外部函数被调用后,闭包结构依然被保存在系统中,闭包中的数据也依然存在,从而可以
实现持久使用。
从这两张图可以看的出,如果返回b,则结果为1;若要返回a,则结果变错误。为什么会这样呢?
首先,在函数test结构体内定义了两个变量,分别存储参数和闭包的结构,而闭包结构中存着参数值。当调用函数
test之后,函数结构被注销,它的局部变量也随之被注销,因此变量a中存储的参数也随之丢失,但由于变量b存储
着闭包结构,因此闭包结构内部的参数并没有被释放,在调用函数之后,依然能从闭包结构中读取到参数值。
看一经典的闭包
1, function test(x){ //外部函数
2, var a=x; //外部函数的局部变量,并把参数值传递给它
3, var b=function(){ //内部函数
4, return a; //访问外部函数中的局部变量
5, };
6, a++; //访问后,动态更新外部函数的变量
7, return b; //内部函数
8, }
9, var c=test(5); //调用外部函数
10, console.log(c()); //调用外部函数,返回外部函数更新后的值为6
详细的解释一下:
第一步,程序在预编译之后,从第九行开始解析执行,创建上下文环境,创建调用对象,把参数,局部变量,
内部函数转换为对象属性;
第二步,执行函数体内代码。在第六行执行局部变量a的递加运算,并把这个值传递给对象属性a,内部函数动
态保持与局部变量a的联系,同时更新自己内部调用变量的值;
第三步,外部函数把内部的函数返回给全局变量c,实现内部函数的定义,此时c完全继承内部函数的所有结构
和数据;
第四步,外部函数返回后会自动销毁,内部结构,标识符,数据随之丢失;
第五步,执行第十行代码,调用内部函数,此时返回的是外部函数返回时(销毁前)保留的变量a所存储的最
新值6.
未完待续。。。。
原文:http://www.cnblogs.com/fnncat/p/4857680.html