1、首先,我们要清楚闭包函数的构成,简单来讲,闭包函数中包含一堆内部函数还有一堆变量。唯一和普通函数不同的是它是一个独立的对象,这个闭包函数中函数和变量构成了一个环境,这个环境构成了它的作用域,。也就是说所有在闭包函数外部的函数或变量不能访问到闭包函数中变量,也不能直接访问闭包中的内部函数,闭包中的内部变量只能由闭包中的内部函数所访问,这样闭包函数就可以作为单独的对象来使用,举例如下:
2、这里首先定义了一个bbcs1的函数,函数中包含了一个局部变量bbcsVar ,同时也包含了一个内部函数,这个闭包函数就是由内部函数和其变量组成了一个闭包的独立的作用域。当我们在调用闭包函数bbcs1时就会在控制台打印局部变量的值,如下图所示:
3、下面再给大家看一个例子如下:
4、由上兔脒巛钒图可以看出,此例子和上个例子的唯一不同之处在于,在此例子当中的闭包函数返回了一个getName对象。然而在控制台输出的依然是name== This is my closure .这是为什帏菱嗨辩么呢?有的人会想,我在调用闭包函数bbcs2的时候已经返回了对象了,但是闭包函数的变量依然能用,这是为什么呢?其实这就是闭包对象的作用,因为bbcs2是个闭包对象!!,给大家解释一下这段代码:首先声明闭包函数bbcs2() 函数中声明一个变量和一个内部函数getName(),然后返回这个内部函数对象,注意:此时只是声明还未调用!!接下来就是定义一个name变量来调用闭包函数对象调用后将getName函数赋给变量name。调用的话使用name();方式进行调用。下面来看一下执行效果。。如下图:
5、下面再看一个闭包的例子:
6、这个例子大家可以想象一下,在控制台上会输出什么样的结果呢?上例子中addNum()是个闭包函数对象,其中入参为x 。返回一个内部函数表达式,参数为y。当我们去调用闭包对象时 一个传入10 ,一个传入16 ,最终返回一个函数对象分别给add10 和add16。此时从控制台输出内部函数调用,一个传入5(传给变量y) ,一个传入10(传给变量y) 。也就是说add10和add16都是闭包。它们共享相同的函数定义,但是保存了不同的环境。在add10的环境中,x为 5。而在add16中,x则为 10。下面来看一下输出结果。
7、上述例子中就是使用闭包函数的例子。也是我在工作过程中遇到的一些问题,很高兴给大家分享。