在前端开发这条路上,相信很多人在前进的过程中都有迷茫或者坎坷的时期,那么是什么支持我们走的那么远呢,相信大多数人的回答都是对前端的热爱。
前端开发真的是一个漫长、艰苦而又收获满满的。当我们回首,以前所踩过的坑,都会使我们变得更强大。
很多人在初入前端时,都会或多或少得遇到一些小问题,有的会被html、css中布局搞得头大,有的会被js的逻辑关系缠得晕头转向,那么我们今天就来简单地谈谈js中闭包吧。
很多人对于闭包的认识就是函数里面嵌套一个函数,我们不妨把闭包理解为是将函数内部和函数外部连接起来的一座桥梁,他就是定义在函数内部的一个函数。
众所周知,js中声明的变量是有作用域的,分为全局变量和局部变量。在函数之外定义的是全局变量,函数内部可以直接读取全局变量。在函数之内定义的是局部变量,函数不能读取其他函数的局部变量。
那么在上述代码中,因为我们的变量a是在函数fn内部定义的,所以他是一个局部变量,那么根据函数不能读取其他函数的局部变量的定义,所以我们函数fn2执行的结果是a is not defined。
那么我们怎样可以读取到函数fn内部的变量呢,这里,我们就可以使用闭包。闭包有两个最大的特点:一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
所以我们在函数fn内部定义了一个函数fn1,此时就形成了一个闭包。在我们执行函数fn时,函数fn1可以获取到函数fn的内部变量,所以我们的执行结果是1。
不过,闭包固然好用,但是因为闭包会使得我们函数中声明的变量都保存在内存中,不被js中的垃圾机制回收(在Javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。因为函数a被b引用,b又被a外的c引用,这就是为什么函数a执行后不会被回收的原因。),所以内存消耗会非常大,导致我们网页性能差,不过这个问题我们可以找到一些解决办法,使用闭包时,我们在退出函数之前,将不使用的局部变量全部删除;而且闭包还会在父函数外部改变父函数内部变量的值。所以我们在使用时要小心,尽量减少闭包的使用。
前端开发这条路漫长、艰辛而又收获满满,希望各位且行且珍惜。