详解 JavaScript 闭包

发布于 2020-12-24 22:44:37 字数 1613 浏览 1086 评论 0

闭包的特性

闭包有三个特性:

  • 函数嵌套函数
  • 函数内部可以引用外部的参数和变量
  • 参数和变量不会被垃圾回收机制回收

闭包的定义及其优缺点

闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。 闭包是 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84961 人气
更多

推荐作者

醉城メ夜风

文章 0 评论 0

远昼

文章 0 评论 0

平生欢

文章 0 评论 0

微凉

文章 0 评论 0

Honwey

文章 0 评论 0

qq_ikhFfg

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文