什么是闭包
1.什么是闭包
闭包:内部函数可以访问到其所在外部函数中声明的参数和变量,即使再外部函数在终结之后
全局作用域中是访问不到局部作用域里面的变量的,js提供的解决办法就是在函数里面在定义一个函数,也就是闭包
闭包函数:声明在一个函数中的函数,叫做闭包函数
2.闭包的优缺点
优点:有利于封装,可以访问到局部变量;不会污染全局变量
缺点:内存占用浪费;内存泄漏
内存泄漏:不再用到的内存,没有及时释放
闭包就是找到同一地址中父级函数中对应变量的值
下面看例子
function fn(){ var a=1; function add(){ console.log(++a); //2 } return add; } var c=fn(); c();
fn()函数执行后,把fn返回的局部函数赋值给全局变量,由于全局变量在代码执行过程中是不会被销毁的,
所以它用到的值即局部函数没有被销毁,而局部函数中使用的变量也就保存下来了
function fn1(){ var i=0; function add(){ i++; console.log(i); } return add; } var b=fn1(); //每次外部函数执行时,都会产生一个引用地址,也就是产生一个新的作用域;所以这里的b和c是两个不同的地址,里面的变量i也是不同的;指向这句话闭包就是找到同一地址中父级函数中对应变量的值 var c=fn1(); b(); //1 c(); //1 b(); //2 c(); //2
b第一次执行时,i=1;变量i被保存下来了,所以第二次执行i时,i=2; c同理;对比下面的案例
function fn1(){ var i=0; function add(){ i++; console.log(i); } return add; } fn1()(); //1 fn1()(); //1 fn1()(); //1 每次函数执行时,产生了新的地址
var i = 0; function fn2(){ function add(){ i++; console.log(i); } return innnerFn; } var b= fn2(); var c= fn2(); b(); //1 c(); //2 b(); //3 c(); //4
这里i是全局变量,i一直保存在内存中;
闭包在js事件中的用法,外部的匿名函数创建新的作用域,内部的函数保持对外部匿名函数作用域的引用,得到i的值
var li=document.getElementsByTagName("li"); for(var i=0,len=li.length;i<len;i++){ (function(i){ li[i].onclick=function(){ alert(i); } })(i) } //如同下面的写法 var li=document.getElementsByTagName("li"); for(var i=0,len=li.length;i<len;i++){ clicks(i,li); } function clicks(i,lib){ lib[i].onclick=function(){ alert(i); } }
var fn=(function fn2(){ var a=1; function add(){ console.log(++a); } return add; })(); fn(); //2
function fn2(){ var a=3; var fn3=function(){ console.log(a); } a++; return fn3; } var b=fn2(); b(); //4,打印出来的a为4,fn2执行之后,a变成4,再执行函数fn3
对象中使用闭包
function person(name){ function get(){ console.log(name); } this._get=function(){ return get; } } var p=new person('xm'); var pp=p._get(); pp(); //xm
加油!