您现在的位置是:首页 > WEB > JSJS

粗略诠释一下javascript中的闭包

阿龙2019-06-24【JS】人已围观

简介本文粗略介绍什么闭包,以及在什么情况下使用闭包,使用闭包的坏处以及性能问题。

闭包在js中很为常见,首先一起来了解一下什么是闭包:简单粗暴理解闭包就是可以读取其它函数内部变量的函数。

什么时候可以使用闭包:
众所周知js的作用域分两种,全局和局部,基于我们所熟悉的作用域链相关知识,我们知道在js作用域环境中访问变量的权利是由内向外的,内部作用域可以获得当前作用域下的变量并且可以获得当前包含当前作用域的外层作用域下的变量,反之则不能,也就是说在外层作用域下无法获取内层作用域下的变量,同样在不同的函数作用域中也是不能相互访问彼此变量的,那么我们想在一个函数内部也有限权访问另一个函数内部的变量该怎么办呢?闭包就是用来解决这一需求的,闭包的本质就是在一个函数内部创建另一个函数。
下面来看一个经典案例
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
JavaScript
//如果要每一个div加一个点击事件,并弹出对应的下标值
//第一种,普通的for循环实现
var aBox = document.getElementsByClassName('box');
for (var i = 0; i < aBox.length; i++) {
   aBox[i].index = i;
aBox[i].onclick = function(){
      alert(this.index)
 }
}
//第二种,使用闭包来实现
var aBox = document.getElementsByClassName('box');
for (var i = 0; i < aBox.length; i++) {
(function (i) {
aBox[i].onclick = function () {
alert(i)
}
})(i)
}
//无论是第一种还是第二种最后的结果都是0,1,2,3,4,第二种方法就是利用了闭包不销毁的特性把每次循环的i进行了保存
闭包的坏处:
首先,JavaScript 具有自动垃圾收集机制,就是找出那些不再继续使用的变量,然后释放其占用的内存。为此,垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间)。常用的的方法有两种,即标记清楚和引用计数。
由于闭包引用另外一个函数的活动对象,因此这个活动对象无法被销毁,这意味着,闭包比一般的函数需要更多的内存消耗。尤其在IE浏览器中需要关注。由于IE使用非原生javascript对象实现DOM对象,因此闭包会导致内存泄露问题。
function closure(){
  var element=document.getElementById("elementID");
  element.onclick=function(){
        alert(element.id);
  }
 }

性能问题:
由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响。

Tags:闭包   javascript

支持一下! ()

文章评论

    共有条评论大侠,来闹两句...

    请输入昵称:

    填入验证码:

打赏本站

  • 如果您觉得站长文章不错,可以通过扫码支付打赏一下哦!
  • 微信扫码:您说多少就多少~
  • 支付宝扫码:您说多少就多少~