(JavaScript) 著名的闭包陷阱

前端之家收集整理的这篇文章主要介绍了(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),那盘子就会被收走了,这就是所谓的内存回收机制。

原文链接:https://www.f2er.com/js/422045.html

猜你在找的JavaScript相关文章