《JavaScript核心技术开发解密》读书笔记(一)
《JavaScript核心技术开发解密》读书笔记(二)
《JavaScript核心技术开发解密》读书笔记(三)
《JavaScript核心技术开发解密》读书笔记(四)
《JavaScript核心技术开发解密》读书笔记(五)
一、三种基础数据结构 【 栈(stack )、堆 (heap)、队列(queue)】
JavaScript 作为一门高级程序语言,并没有同其他语言那样区分栈区或堆区,因此这里不做扩展 我们可以简单粗暴地认为在JavaScript中,所有的数据都是存放在堆内存空间中的。
1、栈: 栈表达的是一种数据在内存中的存储区域,通常叫作栈区。(先进后出)[数组的push,pop]
栈可用来规定代码的执行顺序,在 JavaScript 中叫作函数调用栈( call stack ),它是根据栈数据结构理论而实现的一种实践
2、堆: 堆数据结构通常是一种树状结构。[对象的访问,不用关心对象的属性的顺序]
3、队列: 队列是一种先进先出的数据结构。( 理解队列数据结构的目的是为了搞清楚事件循环( Event Loop )机制到底 是怎么回事 )
二、内存空间
JavaScript 有七种内置类型:
• 空值(null)
• 未定义(undefined)
• 布尔值( boolean)
• 数字(number)
• 字符串(string)
• 对象(object)
• 符号(symbol,ES6 中新增)
引用数据类型(Object)的值是保存在堆内存空间中的对象。引用数据类型都是按引用访问的,在操作对象时,实际上是在操作对象的引用而不是实际的对象
JavaScript的垃圾回收实现主要依靠“引用”的概念。当一块内存空间中的数据能够被访问时,垃圾回收器就认为“该数据能够被获得”。不能够被获得的数据,就会被打上标记,并回收内存空间。这种方式叫做“标记-清除算法”
三、执行上下文
JavaScript代码执行时,会进入一个执行上下文中,执行上下文可以理解为当前代码的运行环境。
JavaScript中的运行环境主要包括三种
全局环境:代码运行起来后首先会进入全局环境
函数环境:当函数被调用执行时,会进入当前函数中执行代码
eval环境:不建议使用
在一个JavaScript程序中,必定会出现多个执行上下文。JavaScript引擎会以栈(即函数调用栈)的方式来处理它们。函数调用栈规定了JavaScript代码的执行顺序。栈底永远都是全局上下文,栈顶则是当前执行上下文。
当一个函数调用时,一个新的执行上下午就会被创建。执行上下文生命周期:创建阶段,执行阶段
创建阶段:创建变量对象,确认作用域链以及this的指向。
执行阶段:开始执行代码,完成变量赋值、函数引用以及执行其他可执行代码。
四、变量对象
JavaScript代码中声明的所有变量都保存在变量对象中,除此之外,变量对象还可能包括以下内容:
函数的所有参数
当前上下文中的所有函数声明(通过function声明的函数)
当前上下文中的所有变量声明(通过var声明的变量)
变量提升
在变量对象的创建过程中,函数声明的执行优先级会比变量声明的优先级更高一点, 而且同名的函数会覆盖函数与变量,但是同名的变量并不会覆盖函数,但是在上下文的执行阶段,同名的函数会被变量重新赋值
如果当前执行上下文处于函数调用栈的栈顶,则意味着当前上下文处于激活状态, 此时变量对象称之为活动对象( AO, Activation Object )。活动对象中包含变量对象的所有属性,并且此时所有的属性都已经完成了赋值,除次之外,活动对象还包含了 this 的指向