function f1(){ n=999; function f2(){ alert(n); } return f2; } //为啥直接f1()访问不到 var result = f1(); result(); f2函数就是闭包。简单来理解,闭包就是能够读取其他函数内部变量的函数。 在js中,只有函数内部的子函数才能读取局部变量,因此闭包可以理解为,定义在一个函数内部的函数
闭包的用途
1,可以读取函数内部的变量
2,就是让这些变量的值始终保持在内存中。
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
//var obj=outerFun()后,变量obj实际上是指向了函数innerFun,再执行c()后就会弹出一个窗口显示i的值;
//当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。
当内部函数 在定义它的作用域 的外部 被引用时,就创建了该内部函数的闭包 ,如果内部函数引用了位于外部函数的变量,当外部函数调用完毕后,这些变量在内存不会被 释放,因为闭包需要它们.
闭包的作用:
闭包的作用就是在outerFun执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回outerFun所占用的资源,因为outerFun的内部函数innerFun的执行需要依赖outerFun中的变量。
也就说遇到需要存储动态变化的数据或将被回收的数据时,我们可以通过外面再包裹一层函数形成闭包来解决。
function a(){
var n = 0;
function inc() {
n++;
console.log(n);
}
inc();
inc();
}
a(); //控制台输出1,再输出2
function a(){
var n = 0;
this.inc = function () {
n++;
console.log(n);
};
}
var c = new a();
c.inc(); //控制台输出1
c.inc(); //控制台输出2
------------------------------------------------------------------------------
function foo(x) {
var tmp = 3;
function bar(y) {
alert(x + y + (++tmp));
}
bar(10);
}
foo(2) ;
foo(2) ; 不管执行多少次都会alert--16 ,因为bar能访问foo的参数x,也能访问foo的变量tmp。
但,这还不是闭包。因为bar()一直在自己的作用域被引用。当你return的是内部function时,就是一个闭包。
------------------------------------------------------------------------------------------------
function a(){
var n = 4;
function b(y){
alert(y+(++n));
}
return b;
}
c=a();
c(10); ----15
c(10); ----16 这个是闭包
--------------------------------------------------------------------------------------------------------