闭包
当内部函数被保存到外部会形成闭包,造成原有的作用域链不释放导致内存泄漏
闭包的作用:
1.实现公有变量
举例:
function add(){ var num=0; function a (){ console.log(++num); } return a } var demo =add(); demo()//1 demo()//2
2,做缓存(存储结构)
function test(){ var food="苹果" var obj={ eatfood:function(){ if(food!=""){ console.log("我要吃"+food) food="" }else{ console.log("这里没有东西吃") } }, pushfood:function(myfood){ food=myfood } } return obj } var demo=test(); demo.eatfood(); demo.eatfood(); demo.pushfood("橘子"); demo.eatfood();
3,实现封装,属性私有化
function D(){ var age=10 this.name="zzz" this.add=function(){ age+=1 console.log(age) }, this.jian=function(){ age-=1 console.log(age) } } var test=new D();
4.模块化开发,防止全局变量污染
var name="abc" var init=(function(){ var name="zzz" function sayName(){ console.log(name) } return function(){ sayName(); } }())
闭包会导致多个执行函数共用一个共有变量,如果不是特殊需要,应该尽量防止这种事情发生
function test(){
var arr=[];
for(var i=0;i<10;i++){
arr[i]=function(){
console.log(i)
}
}
return arr
}
var myarr=test();
for(var j=0;i<10;j++){
myarr[j]();
}
这样执行的结果打印出来的是10个10
要想打印1-9可用立即执行函数
function test(){
var arr=[];
for(var i=0;i<10;i++){
(function(j){
arr[j]=function(){
console.log(j)
}
}(i))
}
return arr
}
var myarr=test();
for(var j=0;i<10;j++){
myarr[j]();
}
小练习:给每个li绑定点击事件,并且输出下标值
<ul> <li>a</li> <li>a</li> <li>a</li> <li>a</li> </ul> var liColer=document.getElementsByTagName("li") for(var i=0;i<liColer.length;i++){ (function(j){ liColer[j].onclick=function(){ console.log(j) } }(i)) }

浙公网安备 33010602011771号