javascript之什么是闭包
什么是js闭包?
Js闭包是前端面试时最常见的题目。而在实际开发过程中,也会经常因为不注意闭包而导致代码运行得不到自己想要的结果。
想要掌握闭包,就必须了解javascript中的变量作用域。
Javascript中的变量根据作用域分为两种:全局变量和局部变量。
全局变量就是在文档最外层声明的,在全文当中都可以读取的变量。
局部变量就是在函数内部声明的,只在该函数内部可以读取的变量。
值得注意的是,在函数内部,可以读取与使用在函数外部声明的全局变量。
以上代码运行结果为:
a是全局变量。b是局部变量。注意,如果在声明变量时,不管你是在函数内部或者函数外部,不使用关键字var,那么这个变量都默认为全局变量。
在函数外部无法读取函数内部的变量:
以上代码运行结果为:
如果我们偏要在函数外部读取函数内部的局部变量怎么办?你可以这么做:
我在fun1函数内部再次声明一个函数fun2,根据变量作用域的特点,我在fun2内,是可以访问到fun1内声明的变量的,但反过来,在fun2内声明的变量,对于fun1来说是不可见的(javascript中的链式作用域)。而之后我将fun2当做fun1的运行结果return出去。在fun1外部用一个参数result接受这个结果,再运行,此时,result()就相当于fun2(),所以上面的代码运行结果是:
利用这种取巧的方法,我就可以在fun1外部读取到fun1内部的局部变量b的值了。
其实,上面的fun2就是一个闭包。
所以,我的理解是,闭包就是能够读取其他函数内部变量的函数,也就是说,凡是定义在函数内部的函数,都可以看做是一个闭包。闭包就是将函数内部环境与函数外部环境链接起来的一座桥梁。
知道了什么是闭包,我们再来看看闭包有什么用?
一般在开发中,闭包主要有两个作用:1、读取其他函数内部的变量。2、让某个函数的变量一直保存在内存中。
第一个作用我们就不用再解释了,直接来看第二个作用,如下图:
以上代码的运行结果为:
还没有评论,来说两句吧...