详解 JavaScript 闭包
闭包的特性
闭包有三个特性:
- 函数嵌套函数
- 函数内部可以引用外部的参数和变量
- 参数和变量不会被垃圾回收机制回收
闭包的定义及其优缺点
闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。 闭包是 JavaScript 语言的一大特点,主要应用闭包场合主要是为了:设计私有的方法和变量。
嵌套函数的闭包
function aaa() {
var a = 1;
return function(){
alert(a++)
};
}
var fun = aaa();
fun();// 1 执行后 a++,,然后a还在
fun();// 2
fun = null;//a被回收!!
JavaScript 的垃圾回收原理
- 在javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收;
- 如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。
使用闭包的好处
- 希望一个变量长期驻扎在内存中
- 避免全局变量的污染
- 私有成员的存在
函数声明与函数表达式
函数声明: 函数有名字; 函数表达式没有名字
(function () {// 立即执行的函数表达式
....
})()
使用匿名函数实现累加
function add () {
var test = 0;
return function () {
test++;
return test;
}
}
var test = add();
console.log(test()); // 1
console.log(test()); // 2
console.log(test()); // 3
console.log(test()); // 4
console.log(test()); // 5
内存泄露问题
由于 IE 的 JS 对象和 DOM 对象使用不同的垃圾回收方法, 因此闭包在IE中会导致内存泄露问题, 也就是无法销毁驻留在内存中的元素.
function closure(){
var oDiv = document.getElementById('oDiv');//oDiv用完之后一直驻留在内存中
oDiv.onclick = function () {
alert('oDiv.innerHTML');//这里用oDiv导致内存泄露
};
}
closure();
//最后应将oDiv解除引用来避免内存泄露
function closure(){
var oDiv = document.getElementById('oDiv');
var test = oDiv.innerHTML;
oDiv.onclick = function () {
alert(test);
};
oDiv = null;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论