微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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),那盘子就会被收走了,这就是所谓的内存回收机制。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐