用浏览器测试几种闭包占用内存的情况

本文通过9个实例探讨JavaScript中闭包对内存的影响,重点分析了不同情况下闭包如何影响内存分配与回收。

更多相关内容见博客 github.com/zhuanyongxi…

这一篇首先是打算证明一下《三个闭包实例理解闭包对内存的影响》

一共有9个例子,例7、8、9需要注意

只测试了Chrome,Chrome版本为67.0.3396.87(正式版本) (64 位)

例1



var a = 12;
function fn() {
  var a = new Array(10000000).join('x');
  return function () {
    var b = 1 + a;
  }
}
var f = fn();

结果,占用内存。

图一

566a5df53eb0b385be2abc5fcb1de2f5be773cf3

例2


var oDiv = document.getElementById("div1");
~function() {
  var fn = function() {};
  fn.data = new Array(10000000).join('x');
  oDiv.onclick = fn;
}();

结果同上图。如果把例子改成:


var oDiv = document.getElementById("div1");
~function() {
  var fn = function() {};
  fn.data = new Array(10000000).join('x');
  // oDiv.onclick = fn;
}();

结果就是这样了,局部作用域中的函数fn被销毁了。

图二

140a8cecd1b97afb00def1ed807137db9006f8ed

例3


function fn(){
  var a = new Array(10000000).join('x');
  return function(){
    var b = 1 + a;
  }
}
fn();

结果同图二,返回函数没有被全局变量接住。

例4

这是一个延时销毁的例子。


function fn(){
  var a = new Array(10000000).join('x');
  return function(){
    var b = 1 + a;
  }
}
fn()();

先这样卡主断点:

fca41c03f98a79e871371ba1d5197c5083d799b9

测试内存结果同图一。

然后让程序运行完成,测试内存的结果就变成了图二。

例5


var fn;
function foo() {
  var a = new Array(10000000).join('x');
  function baz() {
    var b = 1 + a;
  }
  fn = baz;
}

foo();

结果同图一。

例6


function fn() {
  var a = new Array(10000000).join('x')
  return function () {
    console.log("test");
  }
}
var f = fn();

结果同图二,没有被返回的函数使用,销毁。

例7


function fn() {
  var a = new Array(10000000).join('x')
  var b = new Array(10000000).join('x')
  return function () {
    var b = 1 + a;
  }
}
var f = fn();

结果同图一,被返回的函数使用的变量被储存了,没有被使用的被销毁了。

例8


function fn() {
  var a = new Array(10000000).join('x');
  
  function another() {
    var b = 1 + a;
  }
  
  return function() {
    console.log("test");
  };
}
var f = fn();

结果同图一,变量没有被除返回函数之外的其他函数使用,依然会有内存被占用。

例9


function fn() {
  var a = new Array(10000000).join('x');
  return function(a) {
    var b = 1 + a;
  }
}

var f = fn();

结果同图二,没有被占用,变量a实际上被重新声明了。

总结

闭包环境中的变量会有存储在内存中的条件:返回了一个函数被使用(通常是被赋值给了一个外部的变量,例4是一个特殊的情况),且这个函数所在的执行环境中的变量被这个执行环境中的函数使用。

---- 20180625

文章最开始的版本,在返回函数中使用上级变量的方式是console.log(a),这里错了,console.log会把内容打到内存里面,所以在测试例4的时候会有问题。其他的结果虽然在修改之后没有变化,但是在开始时测试的思路不对。



原文发布时间为:2018年06月21日
原文作者:砖用冰西瓜
本文来源:  掘金  如需转载请联系原作者


不敢说gb是最好的浏览器,但是是我用着最顺手的。 ....-- taonnn 我就找了很多浏览器,一个一个试着使用。 最后我选择了GreenBrowser,因为我发现其他浏览器虽然都各有各的优点, 但GreenBrowser是综合素质最高的。最基本的易用性绝对是最好的,你要是用熟了GreenBrowser, 你会发现很多方便实用的功能或快捷键,没有一个浏览器比他全,至少都要缺几个。 而且他小巧只有600多K,免安装使用,纯绿色啊! ....-- lzgs GreenBrowser浏览器有很多使网游爱好者舒心的功能,是其他浏览器没有的,也是本人不愿舍弃GreenBrowser浏览器的重要原因。 例如: 1、状态栏的选择格式,我把**、星期、在线计时、空闲物理内存、已打开页面计数放置在页面,使用起自己的机器就很惬意,对机器状态一目了然。 2、无与伦比的强大而全面的搜索功能。在“工具栏”-“搜索”-“设置搜索引擎”可以随意设置自己喜欢的搜索工具。 3、“自动滚屏”功能,比较鼠标中键滚屏功能的速度更稳定。 很多功能需要使用者逐一体会。 ....-- xiexie 其实一般人用什么浏览器都够用了. 如果你是高手或者每天都要花大量时间挂在网上,推荐你使用 GreenBrowser. GB的按方向鼠标拖拽,搜索栏和状态栏是所有浏览器里面最强大的.强烈推荐. ....-- User 我是做互联网的,每天用浏览器接近10小时,我们部门的同事也是,当你的电脑开着PS DW 再开N个页面,开着WORD Excel foxmail QQ MSN BQQ再开个听歌的播放器的时候就知道有多痛苦了。我们部门10个人,一个用****的我一个用GB的其他都是**,每天到了下午机器慢的要死的时候,只有我的机器撑得住,时间长了同事都觉得有点奇怪,后来我给他们推荐GB,开始他们都不肯换,觉得**好用,因为大家都用过很多浏览器。 后来慢慢的10个人都换了GB..都觉得很赞,4个多月了,没一个人说过难用。... 所以我觉得 GB的推广做的不好,相比其他浏览器而言,知道GB的人真是太少了。 另外就是并不是GB不好用,而且自己没有设置好,刚用GB的时候需要设置很多东西,才能变的适合自己,很多人都没什么耐心,用两 天就开始骂娘... ....-- hilinfeng 就是因为**集成的搜索太少才用的gb,我自定义了10个搜索按钮,分别是百度、google、google(手气不错)、百度 (歌曲)、Sogua、华军软件、天空软件、金山词典、teein、百度贴吧,用着爽,一字排开十个按钮看着也爽! ....-- vlwow 最最最喜欢就是GB的搜索~ “其搜索方式丰富多样,而且设计多一针见血,不取向浮华,不刻意模仿,却着重在朴实和实 用上花足功夫。 ” 说得好。这话实在。 ....-- duskymagus 浏览器少说也试过二三十种了,用久了才知道gb的好处 ....-- sandro26 GB超级稳定的性能及较快的速度和较小的资源占用正是现在其他IE内核浏览器所欠缺的,也是我们最需要的,因此GB是最好的IE内核浏览器。 ....-- wjse 同样很喜欢GB!!喜欢她的纤细、喜欢她的自由制定 ....-- a__gu 我觉得GreenBrowser这个浏览器才是最易用的,最快的浏览器,大家试试啊。鼠标手势很全,搜索功能强大的掉渣! ....-- lilik GB是最好的浏览器,现在用不惯别的浏览器啊!GB做得实在是太人性化了! ....-- winxy 初次接触gb就喜欢上他了,随着日益的了解,更是越来越顺手,几乎离不开他了,gb-真的很人性化的浏览器。 ....-- zmg7852 用过、见过、听说过很多浏览器,全面地评价,还是觉得GB是最好用的浏览器!功能强大,使用方便,而且很多特色是其它浏览器没有的。GB并非完美,于是换用其它浏览器,用了一段时间之后,还是换回GB。界面朴实无华的GB虽然没有其它浏览器那么著名,有些网站公布的用户数量排名中,GB并不显眼,但是——它是最好的!用过几种浏览器才有这个体会!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值