一.闭包的概念
闭包是指有权访问另外一个函数作用域中的变量的函数.可以理解为(能够读取其他函数内部变量的函数)
闭包的作用: 正常函数执行完毕后,里面声明的变量被垃圾回收处理掉,但是闭包可以让作用域里的变量,在函数执行完之后依旧保持没有被垃圾回收处理掉。
二.闭包的原理
每个函数都有自己的执行环境,当一个函数被执行时,其执行环境被推入到环境栈中,其活动对象(存储环境中定义的变量和函数)也被加入到作用域链中,一旦函数执行完毕,栈就会弹出该函数的执行环境,活动对象也被销毁。
三.闭包的用途
读取函数内部变量
让变量始终保持在内存里
闭包的作用就是在执行完并返回后,闭包使得Javascript的垃圾回收机制不会收回所占用的资源,因为内部函数的执行需要依赖中的变量。
四.认识闭包
例子:
function outerFun()
{
vara=0;
function innerFun()
{
a++;
alert(a);
}
}
innerFun()
此示例代码是错误的,因为.innerFun()的作用域在outerFun()内部,所在outerFun()外部调用它是错误的.
改为:
function outerFun()
{
var a=0;
function innerFun()
{
a++;
alert(a);
}
return innerFun; //注意这里
}
var obj=outerFun();
obj(); //结果为1
obj(); //结果为2
var obj2=outerFun();
obj2(); //结果为1
obj2(); //结果为2
转为闭包,当内部函数 在定义它的作用域 的外部 被引用时,就创
建了该内部函数的闭包 ,如果内部函数引用了位于外部函数的变量,当
外部函数调用完毕后,这些变量在内存不会被 释放,因为闭包需要它们.
五.垃圾回收机制
在Javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。因为函数a被b引用,b又被a外的c引用,这就是为什么函数a执行后不会被回收的原因。