很多初学js的可能对于js中的闭包函数有一定的模糊认识,下面我们来看一下闭包函数究竟是何方神圣!
想要了解闭包函数首先我们需要了解一下js中的变量,在js中变量分为两种(局部变量和全局变量)
局部变量:定义在函数内部的变量称为局部变量。
全局变量:定义在函数外部的变量称为全局变量。
不管是局部变量还是全局变量都存在一个作用域的问题,下面我们分别来看一下js中不同的变量的作用域:
如图我们在函数f1种定义了一个变量,此变量因为在函数f1中定义,因此该变量num是一个局部变量,其作用范围只能在当前函数f1中,此时如果外界想要访问该变量num,便会出现对应的错误。如下:
问题:
注意我们在函数中定义变量的时候前面必须添加var关键字,否则定义的变量不再是局部变量,而是一个属于window(窗口)的全局变量,如下代码所示的num就是一个属于window的全局变量:
此时我们可以通过window修改num变量的值,不管是修改前还是修改后我们都可以在函数f1外面访问该变量,不会再出现上面的错误信息,只不过该变量中的值不同,具体访问代码和效果如下图所示:
修改前:
修改后:
闭包函数:
好了扯了那样多,下面我们来看一下闭包函数函数,之前我们说了,再f1中我们通过var关键字定义了一个局部变量num,现在我想要在函数外部访问变量num,之前我们看到会出错,那此时我该如何处理呢?我们可以这样,我们可以在f1中定义另外一个函数f2,此时f2作为f1的子级函数,子级函数会从其上一层开始逐层查找所有的父级函数中的变量,一旦发现存在其要使用的变量,此时可以直接使用其对应父级函数内部的变量。如下所示:
对比上面的代码,我们发现在f1中定义了一个函数f2,并且最终f2作为f1的返回值返回,当外界调用f1时,此时f2被存储在变量fun中,紧接着外界通过fun调用函数f2,并且从外界传入一个数据200,调用过程中将num值修改为200,运行效果如下:
此时f2作为f1内部的函数实现了在函数f1外部访问其局部变量num的操作。由此我们可以得出闭包函数的其中一个作用闭包函数作为一个桥梁,实现在函数外部访问函数内部局部变量的操作。此外闭包函数还有另外一个作用就是保证其所在的函数中的变量的值一直存在。原因如下:
(1)函数f2在函数f1中定义,此时函数f2如果想要存在必须要依赖函数1的存在。
(2)外界在调用函数f1 的同时f2作为返回值被存储在var定义的全局变量fun中,fun作为全局变量存在于整个程序运行过程中,此时f2会被长久存储。
结合上面两点我们不难得出f1和f2会持久存在于程序运行中,其所在的空间会长久存在,因此考虑到节省空间问题,闭包函数在开发过程中尽量少用。
好了今天的探讨就先到这里了。希望能对大家有一定的帮助!
网友评论