闭包
闭包

- example
var btns=document.getElementsByTagName("input")
for(var i=0;i<btns.length;i++){
btns[i].click=function(){
alert(i)
}
}
OUTPUT:这个时候会出现点击每个btn都是alert(4),因为for循环已经执行完了
解决方案:
1.给btn[i].index=i 赋值属性
2.
function init(){
var btns=document.getElementsByTagName("input")
for(var i=0;i<btns.length;i++){
(function(i){
btn[i].onclick=function(){
alert("我是第"+(i+1)+"按钮")
}
})(i)
}
}
如何产生闭包
- 当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时,就产生了闭包,并不需要调用子函数就产生了闭包,也就是外部函数被调用,内部函数被创建的时候
闭包到底是什么
- 理解一:闭包是嵌套的内部函数
- 理解二:包含被引用变量的对象
- 注意:闭包存在于嵌套的内部函数中
产生闭包的条件
- 函数嵌套
- 内部函数引用了外部函数的数据
常见的闭包
1.将函数作为另一个函数的返回值
function fun1(){
var a=0;
function fun2(){
a++;
console.log(a)
}
return fun2;
}
var f1=fun1()
f1()
f1()
OUTPUT:1 2
产生了一个闭包
产生新的闭包:
var f2=fun2()
f2()
f2()
2.将函数作为实参传递给另一个函数调用
- 使用函数内部的变量在函数执行完后,仍然存活在内存中(延长了局部变量的生命周期)
- 让函数外部可以操作(读写)到函数内部的数据
问题
1.函数执行完后,函数内部声明的局部变量是否存在?
- 存在,但是在p=fun()的p里面,换了指向
2.在函数外部能直接访问函数内部的局部变量吗? - 不可以
function fun1(){
var a=0;
var b=0;
var fun2=function(){
a++;
console.log(a)
} -------------这个等到赋值的时候闭包才产生
function fun3(){---------这个在母函数调用的时候就产生了
a--;
console.log(a)
}
}
闭包的声生命周期
- 在嵌套的内部函数成为垃圾对象时,或者赋值为null
闭包的缺点
当window对象还存在时,闭包会占用内存
function fun1(){
var a =new Array(10000);
function fun2(){
console.log(a)
}
return fun2
}
var f=fun2
手动释放
f=null
- example
var name="this.window"
var obj={
name:"this obj",
getName:function(){
return function(){
return this.name;
}
}
}
OUTPUT:this.window
- example
var name="this window"
var obj={
name:"this obj",
getName:function(){
var this_=this
return function(){
console.log(this.name)
console.log(this_.name)
}
}
}
OUTPUT:这里的可以使之指向OBJ

浙公网安备 33010602011771号