1.定义:函数内部的函数形成闭包
2.作用:一个是读取函数中的变量,另外一个是将函数中的变量存储于内存中
3.弊端:闭包会导致函数运行结束后局部变量的空间不会被释放从而造成内存泄漏
注意:
(1)闭包里面使用局部变量和函数传参的时候,用的就是外部函数的局部变量
(2)函数只是在被调用的时候会占用一定的内存空间,所有在函数内部定义的变量,都在函数申请的这块空间内暂存,函数运行完毕,空间就被系统收回
4.函数执行次数和闭包:函数调用的次数越多,占用内存越多,结合闭包以后就会造成内存泄漏
例:函数执行两次,保存的a不相同
function fn(){
var a = 10;
return function(){
console.log(++a);
}
}
var f1 = fn();//f1调用,申请空间保存a,此时a是10,再次调用f1,a变成11,a++
var f2 =fn();//f2调用,再次申请空间保存a,a开始还是10,再次调用f2时,a才会在此基础上增加
f1();//11
f1();//12
f1();//13
f1();//14
f2();//11
例:函数执行一次,返回两个值,产生的a是同一个
function fn(){
var a =10;
function in1(){
console.log(++a);
}
function in2(){
console.log(++a);
}
return [in1,in2]
}
var arr =fn(); //fn只调用一次
var f1=arr[0]; //f1保存in1这个函数
var f2=arr[1]; //f2保存in2这个函数
f1(); //11
f1();//12
f1();//13
f1();//14
f1();//15
f2()
-
注意:
(1)函数传参闭包的运用等同于在外部函数内定义一个变量function fn(num){ return function(){ console.log(++num); } } var f1 = fn(10); var f2 = fn(10); f1(); // 11 f1(); // 12 f1(); // 13 f1(); // 14 f1(); // 15 f2(); // 16
(2)如果使用的是全局变量
var i =1;
function fn(){
return function(){
console.log(i++);
}
}
var f1 =fn();
var f2=fn();
f1(); //2
f1(); //3
f1(); //4
f1(); //5
f1(); //6
f2(); //7
// 由于i是全局变量,所以自始至终函数都是同一个i
闭包实例:点击div打印对应的下标,闭包实现
原理:自执行函数里面的点击方法会形成闭包,随着for循环运行10次,函数也会运行10次,每次tt运行的时候,会有一个和变量a,然后每一个闭包保存了函数t运行时候的变量a
for(var i=0;i<items.length;i++){
(function(){
var a =i;
items[i].click=function(){
console.log(a)
}
})()
}
等同于:
for(var i=0;i<items.length;i++){
(function(a){
var a =i;
items[i].click=function(){
console.log(a)
}
})(i);
}