1 JavaScript内存管理
2 垃圾回收机制算法
3 闭包的概念理解
4 闭包的形成过程
5 闭包的内存泄漏
一个函数只有调用了外部的变量,才算是闭包。函数内和函数外会写成闭包。
深入JS闭包-闭包的访问过程
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <script> // function adder(num, count) { // return num + 5 // } // add(100, 5) // add(55, 5) // add(12, 5) // add(22, 8) // add(35, 8) // add(7, 8) function createAdder(count) { function adder(num) { return count + num } return adder } var adder5 = createAdder(5) adder5(100) adder5(55) adder5(12) var adder8 = createAdder(8) adder8(22) adder8(35) adder8(7) console.log(adder5(24)) console.log(adder8(30)) // 永远不会再使用adder8 // 内存泄漏: 对于那些我们永远不会再使用的对象, 但是对于GC来说, 它不知道要进行释放的对应内存会依然保留着 adder8 = null </script> </body> </html>
深入JS闭包-内存泄漏的测试
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <button class="create">创建一系列的数组对象</button> <button class="destroy">销毁一系列的数组对象</button> <script> function createArray() { // 4 1024 -> 4kb * 1024 -> 4M var arr = new Array(1024*1024).fill(1) function test() { console.log(arr) } return test } // 点击按钮 var totalArr = [] var createBtnEl = document.querySelector(".create") var destroyBtnEl = document.querySelector(".destroy") createBtnEl.onclick = function() { for (var i = 0; i < 100; i++) { totalArr.push(createArray()) } console.log(totalArr.length) } destroyBtnEl.onclick = function() { //只要赋值为空,之前的内存全部都清空了 totalArr = [] } </script> </body> </html>