一、 闭包的定义
能访问其他函数内变量的函数,这种结构就是闭包
二、闭包的用途
1.读取函数内部的变量
2.让这些变量的值始终保持在内存中(结果缓存)
3.创建匿名自执行函数(避免全局变量的污染)
三、闭包的弊端
1.使用不当会很容易造成内存泄露
2.常驻内存,增加内存使用量
(以上资料来源网络)
变量的生命周期
全局变量活得和您的应用程序(窗口、网页)一样久。
局部变量活得不长。它们在函数调用时创建,在函数完成后被删除。
函数模式的闭包:在一个函数中有一个函数
function fun1() {
var num=777;
//函数的声明
function fun2() {
console.log(num);
}
//函数调用
f2();
}
f1();
对象模式的闭包:函数中有一个对象
function f3() {
var num=10;
var obj={
age:num
};
console.log(obj.age);//10
}
f3();
官方对闭包的定义:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
结合以上示例,分析官方定义:
1、环境的表达式(通常是一个函数)—指的是函数b;
2、b拥有很多变量:c、n…;
3、b绑定了这些变量,比如b绑定了n;每次通过f1执行完b后,b的执行上下文n不消失,可以每次叠加。
4、这些变量也是该表达式的一部分:c、n确实是b函数的一部分。
还有一种对闭包更直接明了的说法:闭包就是有权访问另一个函数作用域中变量的函数。
分析这句话:
1.闭包是定义在函数中的函数.
2.闭包能访问函数内的私有变量.
3.即使包含函数执行完了, 被闭包引用的变量也得不到释放.
闭包的意义在于:
js有两个作用域:全局作用域,函数的局部作用域;
局部作用域内可以访问全局作用域,但是全局作用域内却无法访问局部作用域。
————————————————
总结:
总结:如果想要缓存数据,就把这个数据放在外层的函数和里层的函数的中间位置
闭包的作用:缓存数据.优点也是缺陷,没有及时的释放
局部变量是在函数中,函数使用结束后,局部变量就会被自动的释放
闭包后,里面的局部变量的使用作用域链就会被延长