堆栈操作
相关名词
- JS 执行平台:
- 不同浏览器
- Nodejs
- webview
- 不论是哪一种平台都需要具备代码执行的环境
- 执行环境
- 不论何种语言编写的代码,最终执行都是发生在内存中
- JS代码执行时会生成一个栈空间,它的本质也是内存空间
- 每当浏览器加载界面时就会从计算机内存中申请一片空间,称之为执行环境栈
- ESC(execution stack context)
- 执行上下文
- 一个 JS 文件会包含多行代码,不同行代码组合在一起就是代码块
- 多个代码块中的代码直接放入栈中运行,必须会出现互相干扰语法冲突
- 每个代码块都有自己的执行上下文,在上下文中保存了当前段代码执行时所需要数据
- 执行上下文使用 EC(execution context) 表示
- 进栈执行
- 执行环境栈是一个先进后出的栈结构
- 代码运行时会产生不同的执行上下文
- 不同上下文进栈执行,执行代码,最终决定是否出栈
- EC(G)
- execution context global,全局执行上下文,浏览器加载界面时默认创建
- VO(G)
- variable object,全局变量对象,用于存放全局上下文当中声明定义的变量
- GO
- global object,全局对象,它和 VO 并不是一个东西,在浏览器平台下我们可以认为是 window
- 做为一个对象,它同样占据空间,浏览器加载界面时就会创建,在它内部保存了许多 JS 可以直接调用的内容
- 例如
setInterval setTimeout JSON
等 - 为了方便使用上述的 API, 在 VO(G) 当中就创建了一个 window 属性指向当前的空间
- 声明:采用具体的关键字声明一个变量 var let const function
var name
- 定义:定义就是给某一个变量执行赋值
name = 'kobe'
基本类型堆栈处理
-
基本数据类型是按值进行操作
-
基本数据类型值是存放在 栈区的
-
无论我们当前看到的栈内存,还是后续引用数据类型会使用的堆内存都属于计算机内存
-
GO(全局对象)
引用类型堆栈处理
函数堆栈处理
-
函数创建
- 可以将函数名称看做是变量,存放在 VO 当中 ,同时它的值就是当前函数对应的内存地址
- 函数本身也是一个对象,创建时会有一个内存地址,空间内存放的就是函数体代码(字符串形式的)
-
函数执行
- 函数执行时会形成一个全新私有上下文,它里面有一个AO 用于管理这个上下文当中的变量
-
步骤:
- 作用域链 <当前执行上下文, 上级作用域所在的执行上下文>
- 确定 this
- 初始化 arguments (对象)
- 形参赋值:它就相当于是变量声明,然后将声明的变量放置于 AO
- 变量提升
- 代码执行
闭包堆栈处理
-
闭包: 是一种机制:
- 保护:当前上下文当中的变量与其它的上下文中变量互不干扰
- 保存:当前上下文中的数据(堆内存)被当前上下文以外的上下文中的变量所引用,这个数据就保存下来了
-
函数调用形成了一个全新的私有上下文,在函数调用之后当前上下文不被释放就是闭包(临时不被释放)