闭包的定义和作用
闭包定义:定义在一个函数内部的函数,静态保存所有了父级作用域的内部函数。
闭包定义:外部函数定义的内部函数就是闭包
简言之:闭包是就是函数中的函数,里面的函数可以访问外面函数的变量,外面的变量的是这个内部函数的一部分
闭包的作用:
闭包给访问外部函数定义的内部变量创造了条件,也将关于函数的一切封闭到了函数内部,减少了全局变量,这也是闭包的真实含义。
闭包的作用:
1、将函数作为参数传入另外一个函数。
2、实现封装,管理私有变量和私有方法,将变量(状态)的变化封装在安全的环境中。
3、使用闭包可以访问父级函数中的变量,并将其长期保存。
4、匿名自执行函数。在匿名自执行函数传入一个闭包函数,匿名自执行函数执行完立即销毁,可以减小内存消耗。
5、可以使变量长期保存在内存中(IncrementByTen 示例),生命周期比较长,缺点是内存消耗大。
JS示例:
1function outer(){
2 var num=0;//内部变量
3 return function add(){//通过return返回add函数,就可在outer函数外访问了
4 num++;//内部函数有引用,作为add函数的一部分了
5 console.log(num);
6 };
7}
8var func1=outer();//
9func1();//实际上是调用add函数, 输出1
10func1();//输出2
11var func2=outer();
12func2();// 输出1
13func2();// 输出2
与普通函数的区别:
1、普通函数只能曝光内部的值。方法A定义全局变量,但占用的内存无法释放且函数使用的变量定义到了函数外部不便于理解和管理。方法B将内部变量当参数传递,此种方法不美观太丑陋。
2、函数每次执行时都会且只会初始化其内部变量,导致了闭包与普通函数的最大区别。就是每次调用普通函数时它内部都被初始化成一致状态,导致执行的结果是一致的。闭包不同,它的本质是内部函数,调用闭包只会初始化内部函数变量,外部函数的变量没有被初始化,实现了变量值的传递。外部函数只在定义闭包时被初始化。闭包消亡时内存被回收。
什么时候需要使用闭包:
当每次调用函数A时都要改变全局变量B,且B只与A有关。以往没有闭包时只能将B定义为全局变量,现在可以将B定义为A的内部变量,同时在A内部定义闭包C,并将C当值返回。