讲真 这个纯粹是学习笔记 因为说实话 以我的功力 在实际项目中能很好的运用闭包还真的是个问题 但是感觉作为前端 不理解闭包真是个没有职业操守的事情
所以我就学习了一下 首先 是变量的作用域 js中变量的作用域一共也就两个 全局变量跟局部变量
函数内部可以读取全局变量 但是在函数外部却无法读取函数内部的局部变量
所以如何从函数外部读取函数内部的局部变量呢 这就是个问题了 既然考虑到之前说的 函数内部可以读取函数外部的全局变量 那么 是不是可以在函数内部构造一个函数呢
写个例子哈 function f1(){
var a=1; //比如你想在函数外部读取这个变量a的值 你得咋办 很好办啊 你让它作为另一个函数的全局变量 function f2(){
alert(a);
}
return f2();
}
这样你再调用f1的时候 自然会弹出a的值了 然后这个里边f2其实就是一个闭包 所以我理解的闭包就是能够读取其他函数内部变量的函数 。根据js的变量作用域概念 只有函数内部的子函数才能读取函数内部的变量 所以 闭包也可以理解为定义在函数内部的子函数
这里在插播一句 闭包是啥 闭包是函数的一种 this是啥 this是个对象
说了这多 也应该说说闭包的作用了 第一当然就是读取函数内部的变量 第二就是能够让这些变量保存在内存中
下面请看这个例子
function f1(){
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000
这里f2可以读取到f1内部的变量n的值 第一遍运行result()的时候 弹出n=999; 注意 nAdd=function(){n+=1}前边没有var 说明是全局的然后执行了一边nAdd()这个函数
看弹出结果 可以看出来 这里边第一次执行完f1之后 n一直保存在内存中;也就是说f1中的局部变量并没有在运行完之后自动清除