闭包的概念
闭包 : 如果一个「函数」使用了它范围外的「变量」,那么这个「函数」加上这个「变量」就是一个闭包。
最简单的闭包模型
var n;
function x(){
console.log(n)
}
有 return 和 函数包裹的闭包模型
function x(){
var n= 666;
function y(){
console.log(n)
}
return y
}
var z = x();
z() //666
上面代码里的 y 函数与 n 变量就构成了一个闭包。
为什么要函数套函数呢?
是因为需要局部变量,所以才把 n 放在一个函数里,如果不把 n 放在一个函数里,n 就是一个全局变量了,达不到使用闭包的目的——隐藏变量。
函数套函数只是为了造出一个局部变量,跟闭包无关。
为什么要 return y 呢?
因为如果不 return,你就无法使用这个闭包。
return是要让外面可以访问到这个 y 函数就行了。
所以 return y 只是为了 y 能被使用,也跟闭包无关。
闭包的作用
1.读取函数内部的变量
function f1() {
var n = 999;
function f2() {
console.log(n);
}
return f2;
}
var result = f1();
result(); // 999
上面代码中,函数 f1 的返回值就是函数 f2 ,由于 f2 可以读取 f1 的内部变量,所以就可以在外部获得 f1 的内部变量了。
2.让这些变量始终保持在内存中,即闭包可以使它诞生环境一直存在
function xxx(start) {
return function () {
return start++;
};
}
var inc = xxx(5);
inc() // 5
inc() // 6
inc() // 7
上面代码中,start 是函数 xxx 函数的内部变量。通过闭包,start的状态被保留了,每一次调用都是在上一次调用的基础上进行计算。从中可以看到,闭包inc使得函数 xxx 的内部环境,一直存在。所以,闭包可以看作是函数内部作用域的一个接口。
为什么会这样呢?
原因就在于 inc 始终在内存中,而 inc 的存在依赖于 xxx 函数,因此也始终在内存中,不会在调用结束后,被垃圾回收机制回收。
参考:方应杭:闭包