摘录于(作者:茄果)
一、闭包
输出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)
,那盘子就会被收走了,这就是所谓的内存回收机制。