js函数闭包的作用
1、1.函数闭包的作用
1). 让我们在全局作用域中访问局部变量
2). 让局部变量一直驻留在计算机的内存中
运行结果:报错,变量i未定义,为什么会出现以上情况:
3). 作用域不允许
4).受到垃圾回收机制的影响,当函数执行完毕后,其内部的变量和函数要被回收掉
2、2.Javascript垃圾回收机制
在垃圾回收机制中一共存在两种算法:① 标记算法 ② 引用计数器算法
以引用计数器算法为例:
3、3.通过原理图的理解:
当程序运行时,如果某块内存区域,如display函数内部的var i = 10;要进行使用,所以会自动在内存中开辟一块内存空间,初始化计数器为0,由于display需要使用到这个变量i,所以引用计数器进行+1操作,当display函数执行完毕后,由于这块区域不需要引用了,所以进行-1操作,重置为0,由于计数器为0,系统会自动认为这块区域已经没用了,自动回收,所以当我们在全局作用域中再次调用变量i,其已经被回收了!
4、4.模拟闭包特性
5、5.以上程序可以正常弹出“hello”字符串?
虽然在Javascript中,函数执行完毕后,其内部的局部变量和函数都要被内存所回强蕉收,但是由于其把局部函数fn的首地址作为display函数的返回值并把其赋值给全局变量func,这就导致了存在了一种引用关系,全局变量中有一个变量引用了fn函数的首地址,用引用计数器的原则可知,其计数器会自动进行+1操作
6、6.使用闭包访问局部变量
当宙荡代码执行到第21行时,系统执行display函数并把执行后的结果(局部函数fn在内存中的首地址)赋值给func这个全局变量,这样就会导致局部变量fn函数的引用计数器进行+1操作。又由泥欠雁于fn函数引用了局部变量i,所以根据作用域链的原则,系统会自动寻找var的声明语句,找到上级作用域var i=10则直接使用。然后继续向下执行到第23行代码,调用func()就相当于找到fn函数在内存中的首地址并执行,由于受到作用域链的影响会自动弹出局部变量i。我们把fn函数就称之为“闭包函数”。
7、7.让局部变量一直驻留在计算机的内存中
8、8.函数闭包应用:形成独立的作用域,不受其他因素的影响