JavaScript 进阶之闭包

发布于 2021-11-27 12:01:25 字数 1200 浏览 1109 评论 0

什么是闭包

函数嵌套函数,内部函数可以引用外部的参数和变量,参数和变量不会被垃圾回收机制所收回,外部函数最终返回内部函数的函数名。

从垃圾回收机制来看,一个闭包就是当一个函数返回时,一个没有释放资源的栈区。例如:

function test(num){
  var sum=5;
  function alertSum(){
    sum+=num;
    alert(sum);
  }
  return alertSum;
}
var a=test(5);
a();//10		

闭包的作用,应用在哪里

好处

  1. 希望一个变量长期驻扎在内存中
  2. 避免全局变量的污染
  3. 私有成员的存在,保护内部变量不被外部调用

实际用法:

模块化代码,减少全局变量污染。

(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 技术交流群。

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

发布评论

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

关于作者

倾城泪

暂无简介

0 文章
0 评论
531 人气
更多

推荐作者

醉城メ夜风

文章 0 评论 0

远昼

文章 0 评论 0

平生欢

文章 0 评论 0

微凉

文章 0 评论 0

Honwey

文章 0 评论 0

qq_ikhFfg

文章 0 评论 0

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