JavaScript 进阶之闭包
什么是闭包
函数嵌套函数,内部函数可以引用外部的参数和变量,参数和变量不会被垃圾回收机制所收回,外部函数最终返回内部函数的函数名。
从垃圾回收机制来看,一个闭包就是当一个函数返回时,一个没有释放资源的栈区。例如:
function test(num){
var sum=5;
function alertSum(){
sum+=num;
alert(sum);
}
return alertSum;
}
var a=test(5);
a();//10
闭包的作用,应用在哪里
好处
- 希望一个变量长期驻扎在内存中
- 避免全局变量的污染
- 私有成员的存在,保护内部变量不被外部调用
实际用法:
模块化代码,减少全局变量污染。
(function(){
//模块化代码
})()
在循环中不用设置 index 直接找到对应元素的索引。
var aBtn = document.getElementsByTagName('button');
for(var i = 0; i < aBtn.length; i++){
(function(i){
aBtn[i].onclick=function(){
//do something
}
})(i);
}
闭包需要注意的地方
IE避免内存泄漏,例如:
function closureTest(){
var testDiv=document.getElementById('div1');
testDiv.onclick=function(){
testDiv.style.left=100+'px';
}
}
closureTest 方法创建了一个内部匿名函数,由于 testDiv 的 onclick 属性引用了该匿名函数,testDiv是一个外部对象,所以该匿名函数会在内存中保存。
而该函数所要用的testDiv对象也一直保存在内存中。本来的意愿是不希望 testDiv 长久保留的,这样就形成了内存泄漏。
解决办法,利用
window.onunload = function(){ testDiv.onclick = null; }
结束循环引用。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: 前端学习笔记之面向对象
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论