当内部函数被保存在外部,会生成闭包。 这会造成父函数生成的AO不被释放,占据内存空间。这会造成内存泄漏。
内存泄漏:由于内存大量被使用,计算机的可用内存像泄漏了一样,导致可用内存少。
function a() { function b() { var bbb = 234; document.write(aaa); } var aaa = 123; return b; } var glob = 100; var demo = a(); // 123。虽然a()执行结束,a应该销毁了自己的AO。 // 但是b生在于AO,而a的AO被引用在b的执行期上下文中,b保存了a的当前AO。 // a不再引用自己生成的AO,下次a执行会创建新的AO病2使用。 // 这就是【闭包】。 demo(); // 内部函数被保存到外部,就会生成闭包。 function a1() { var num = 100; function b() { num++; console.log(num); } return b; } // 调用a1,最后a执行完之前demo1被赋值b。a1销毁。 var demo1 = a1(); // 这样b就脱离原来的a1了。调用b,a1不再执行了,num = 100+1, 返回101 demo1(); // 再调用b,a1不再执行,不会重新初始化num,num=101+1, 返回102 demo1(); // 闭包的应用-共有变量:累加器,更加结构化 function add() { var count = 0; function d(){ count ++; console.log(count); } return d; } var counter = add(); counter(); counter(); counter(); // 闭包的应用-缓存:myArr内元素公用一个t生成的AO function t(){ var num=100; function a() { num ++; console.log(num); } function b() { num --; console.log(num); } return [a,b]; } var myArr = t(); myArr[0]; // 100 + 1 = 101 myArr[1]; // 101 - 1 = 100 // 闭包的应用-缓存:将obj缓存 function eater() { var food = ""; var obj = { eat: function() { console.log(`I am eating ${food}`); food = ""; }, push: function(myFood) { food = myFood; } } return obj; } var eater1 = eater(); eater1.push("Food"); eater1.eat();
原文:https://www.cnblogs.com/sven4900/p/14049845.html