JS面试---闭包
一 什么是闭包
一个函数和词法环境捆绑在一起的组合就是闭包。
???看看上面是啥鬼话,我们可以说的人性化一点:
函数A执行后返回的是其内部的B函数,并且B函数可以在A函数外部访问A函数内的变量即形成闭包,下面我们通过一个例子来形象的理解下:
function f1() {let a = 666;// 用var也一样function f2() {console.log(a);}return f2;}let res = f1();res();//----------666
我们知道,在JS中,函数内部可以访问外部的变量,但是在函数外部却不能访问到函数内部的变量,而在上面的例子中确实完成了函数外部对函数内部变量的访问。相信大家看到这已经稍微闭包了,我们继续趁热打铁。
二 闭包的特点
1 持久性的存储
在JS中,当内存中的值失去引用时便会被垃圾回收机制处理释放内存,但是闭包可以进行拦截导致某块内存永远存在,我们来看下面这个例子
var fn = null;function f1() {var a = 666;function f2(){console.log(a);}fn = f2;}f1()fn()//-------666
正常来说在f1()执行完之后其生命周期也就结束了,是无法访问到内部a的,但是由于f2的引用被赋给了fn,所以f2便被保存下来,而 f2中的a是依赖于f1中定义的a的,所以f1也被保存了下来,因此可以在f1执行后继续在外部访问其内部的变量a。
2 可能导致内存泄漏
上面我们知道了闭包会将数据持久性的存储,但是不要忘了 每次外部函数执行前都会开辟出新的内存空间 ,并且函数的地址不同,开辟出的内存地址也不同导致一块内存被长期占用而不会被垃圾回收机制释放,便会导致内存泄漏,我们来看下面的例子:
function init() {var a = 0;return function (){console.log(++a);}}let resA = init();let resB = init();resA()//----1resA()//----2resB()//----1resB()//----2
大家可以看到运行的结果应该可以很直观的理解到,我就不絮叨了。
三 笔记
下面是本人学习闭包是做的笔记,可能不太完善,大家有兴趣的可以看看。
1 定义
函数和词法环境的引用捆绑在一起的组合就是闭包.
在一个函数A内部有一函数B,并且将B函数return出去便使在外部的B函数能够访问A函数中的变量即形成了一个简单的变量闭包。
在A函数执行完之后其内的变量并不会被垃圾回收机制释放,因为内部的函数B的引用在其他地方使用,导致A函数也被保存下来,所以A函数执行完之后仍然可以通过B函数访问到其内部的变量
2 作用
1 可以在函数外部访问到函数內部的变量
2 可以将某个函数内部的值保存下来
3 可以避免使用全局变量,赋值全局变量被污染
3 缺点
每次外部函数执行前都会开辟出新的内存空间,并且函数的地址不同,开辟出的内存地址也不同
导致一块内存被长期占用而不会被垃圾回收机制释放,便会导致内存泄漏
关于闭包的知识还有很多,上面提到的知识最基础的使用,要想学习更多的闭包知识建议自行查找资料学习。如有错误,请各位指出。谢谢!

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
