函数和函数内部能访问到的变量的总和,就是一个闭包。
特点:
1、能让外部访问函数内部的变量
2、避免使用全局变量,防止全局变量污染
3、局部变量会常驻内存中,会造成内存泄漏
function test(){
var i=10;
return function leijai(){
i++;
return i;
}
}
var a=test() //此时a就是里面的leijia函数
a() //11
a() //12
a() //13
i声明在test函数内部,所以test内部的laijia函数也能访问此变量,a是执行test函数,返回的是test函数里的leijia函数
image.png
因为JS的回收机制,自动回收不再使用的内存空间,但是闭包会阻止某些回收,因为leijia函数依然持有其所在作用域的引用,所以其内部作用域不会被回收
a()才是执行leijia函数
var arr=[]
undefined
for(var i=0;i<3;i++){
arr[i]=function(){
console.log(i)
}
}
arr[0]()//3
arr[1]()//3
arr[2]()//3
函数不调用是不会执行的,这里arr[i]只会执行最后i=3的结果
var arr = []
for (var i = 0; i < 3; i++) {
console.log('i的值是:' + i)
arr[i] = (function (i) {
return function(){
console.log(i)
}
})(i)
}
arr[0]()//0
arr[1]()//1
arr[2]()//2
加了立即执行函数,不调用的话输出:
image.png
调用后:
image.png
闭包的用途:
1.从外部读取函数内部的变量。
function f1() {
var n = 9;
function f2() {
console.log(n);
}
return f2;
}
var result = f1();
result(); // 9
//这段代码中,函数f1的返回值就是函数f2,由于f2可以读取f1的内部变量,所以就可以在外部获得f1的内部变量了。
2.让这些变量始终保持在内存中。
function f1(n) {
return function () {
return n++;
};
}
var a1 = f1(1);
a1() // 1
a1() // 2
a1() // 3
//这段代码中,闭包使得内部变量记住上一次调用时的运算结果。
3.封装对象的私有属性和私有方法。
function f1(n) {
return function () {
return n++;
};
}
var a1 = f1(1);
a1() // 1
a1() // 2
a1() // 3
var a2 = f1(5);
a2() // 5
a2() // 6
a2() // 7
//这段代码中,a1 和 a2 是相互独立的,各自返回自己的私有变量。
网友评论