原文地址:git
1-1 理解 Javascript 执行上下文和执行栈github
1-5 JavaScript深刻之4类常见内存泄漏及如何避免bash
原文地址数据结构
执行上下文就是当前JavaScript代码被解析和执行时所在环境的抽象概念,JavaScript 中运行任何的代码都是在执行上下文中运行。闭包
分两阶段建立函数
原文地址工具
JavaScript 引擎并不是一行一行地分析和执行程序,而是一段一段地分析执行。
var a = 20;
var b = 'abc';
var c = true;
var d = { m: 20 }
复制代码
在JavaScript中,最经常使用的是经过标记清除的算法来找到哪些对象是再也不继续使用的,a=null是一个释放引用的操做,脱离执行环境,这个值会在下一次垃圾收集器执行操做时被找到并释放。
JavaScript的内存管理机制是:内存基元在变量(对象,字符串等等)建立时分配,而后在他们再也不被使用时“自动”释放。后者被称为垃圾回收。
JS内存空间分为栈(stack)、堆(heap)、池(通常也会归类为栈中)。 其中栈存放变量,堆存放复杂对象,池存放常量。
内存分配 --- 内存使用 --- 内存回收
存在一个致命的问题:循环引用。若是两个对象相互引用,尽管他们已再也不使用,垃圾回收器不会进行回收,致使内存泄露。
标记清除算法将“再也不使用的对象”定义为“没法达到的对象”。从根部(在JS中就是全局对象)出发定时扫描内存中的对象,凡是能从根部到达的对象,都是还须要使用的。那些没法由根部出发触及到的对象被标记为再也不使用,稍后进行回收。
在 JavaScript 文件头部加上 'use strict',能够避免此类错误发生。启用严格模式解析 JavaScript ,避免意外的全局变量。
本质上,闭包的链表已经建立,每个闭包做用域携带一个指向大数组的间接的引用,形成严重的内存泄漏。