JavaScript 著名的闭包陷阱

摘录于(作者:茄果)

一、闭包

输出1
c();    //控制台输出2

二、著名的闭包陷阱

乍一看,以为输出 0~9,万万没想到输出10个10
这里的陷阱就是:函数()才是执行函数! 单纯的一句var f = function() { alert('Hi'); };是不会弹窗的,后面接一句f();才会执行函数内部的代码。上面代码翻译一下就是:

函数,函数内部不变,不能将函数内的i替换!
result[1] = function(){ return i; }; //没执行函数函数内部不变,不能将函数内的i替换!
...
result[9] = function(){ return i; }; //没执行函数函数内部不变,不能将函数内的i替换!
i = 10;
funcs = result;
result = null;

console.log(i); // funcs[0]()就是执行 return i 语句,就是返回10
console.log(i); // funcs[1]()就是执行 return i 语句,就是返回10
...
console.log(i); // funcs[9]()就是执行 return i 语句,就是返回10

为什么只垃圾回收了result,但却不收了i呢? 因为i还在被function引用着啊。好比一个餐厅,盘子总是有限的,所以服务员会去巡台回收空盘子,但还装着菜的盘子他怎么敢收? 当然,你自己手动倒掉了盘子里面的菜( = null),那盘子就会被收走了,这就是所谓的内存回收机制。

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...