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