JS底层知识理解之执行上下文篇
JS底层知识理解之执行上下文篇

一、什么是执行上下文(Execution Context)
执行上下文可以理解为当前代码的执行环境,它会形成一个作用域。
二、JavaScript引擎会以什么方式去处理多个EC
答案:堆栈。
堆栈底部永远都是全局上下文(Global Context),而顶部就是当前(活动的)执行上下文。堆栈在EC类型进入和退出上下文的时候被修改(推入或弹出)。
//其实,这里可以将堆栈看作一个数组
ECStack = [];
//数组的最后一项
ECStack[ECStack.length - 1] = 全局上下文;
//数组的第一项
ECStack[0] = 当前的执行上下文;
三、EC的分类
1、全局EC
JavaScript代码运行起来会首先进入该环境。
全局代码是在"程序"级处理的:例如加载外部的js文件或者本地<script></script>标签内的代码,并不包括任何function体内的代码。
【全局上下文只有唯一的一个,直到应用程序退出,保存在其中的所有变量和函数定义才会被销毁】
//在初始化(程序启动)阶段,ECStack是这样的:
ECStack = [
globalContext
];
2、函数EC
当函数被调用执行时,会进入当前函数中执行代码;函数执行环境中的所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁。
当进入 function 函数代码(所有类型的funtions)的时候,ECStack 被压入新元素。
tips:
1、具体的函数代码不包括内部函数(inner functions)代码
2、同步执行,只有栈顶的上下文处于执行中,其他上下文需要等待
3、函数中,遇到 return语句 能直接终止 可执行代码(Execution Code) 的执行,因此会直接将 当前EC 弹出栈
(类似于数组中的 shift() 方法,因为所弹出的当前EC是ECStack[0]);
4、相关代码执行完以后,ECStack只会包含 全局上下文,一直到整个应用程序结束。
5、每次某个函数被调用,就会有个新的执行上下文为其创建,即使是调用的自身函数,也是如此
6、函数的执行上下文的个数没有限制
// 例子
(function foo(bar) {
if (bar) {
return;
}
foo(true);
})(); // 第一次foo的激活调用
ECStack = [
<foo> functionContext,
globalContext
]; // foo的递归激活调用
ECStack = [
<foo> functionContext – recursively(递归的意思),
<foo> functionContext,
globalContext
];
四、EC的生命周期
第一阶段:EC创建阶段
1、创建变量对象(Variable Object)
2、建立作用域链
3、确定 this 的指向
第二阶段:EC执行阶段
1、变量对象转化为活动对象 (VO -----》AO)(只在函数环境下才有这个转化)
2、变量赋值
3、函数引用
4、执行其他代码
五、例子简析
例1:
var color = 'blue';
function changeColor() {
var anotherColor = 'red';
function swapColors() {
var tempColor = anotherColor;
anotherColor = color;
color = tempColor;
}
swapColors();
}
changeColor();
EC的入栈出栈整个过程可以描述为:“先进后出,后进先出”。
1、全局上下文入栈
2、changeColor的执行上下文入栈
3、swapColors的执行上下文入栈
4、swapColors的执行上下文出栈
5、changeColor的执行上下文出栈
6、全局上下文在浏览器窗口关闭后出栈
例2:
function outer(){
var n=999;
function inner(){
alert(n);
}
return inner;
}
var result=outer();
result(); //
1、全局上下文入栈
2、outer的执行上下文入栈
3、outer的执行上下文出栈
4、inner的执行上下文入栈
5、inner的执行上下文出栈
6、全局上下文在浏览器窗口关闭后出栈
注意:因为 outer 中的函数 inner 在 outer 的可执行代码中,并没有被调用执行,因此执行 outer 时,inner 不会创建新的上下文,而直到 resul t执行时,才创建了一个新的执行上下文。
参考博文:
http://blog.csdn.net/pingfan592/article/details/55189804
http://www.cnblogs.com/TomXu/archive/2012/01/13/2308101.html
JS底层知识理解之执行上下文篇的更多相关文章
- js的基础(平民理解的执行上下文/调用堆栈/内存栈/值类型/引用类型)
与以前的切图比较,现在的前端开发对js的要求似乎越来越高,在开发中,我们不仅仅是要知道如何运用现有的框架(react/vue/ng), 而且我们对一些基础的知识的依赖越来越大. 现在我们就用平民的方法 ...
- 理解Javascript_02_执行上下文02
上一篇我们讲到在全局环境下的代码段中,执行上下文环境中如何处理数据: 变量.函数表达式——变量声明,默认赋值为undefined: this——赋值: 函数声明——赋值: 这篇文章讲关于函数执行上下文 ...
- 理解Javascript_02_执行上下文01
执行上下文又名执行上下文环境 JS中为什么会产生这个概念呢,先来看一下下面的这段代码: 通过执行发现,第一句代码报了ReferenceError,第二句和第三句代码是undefined,由于undef ...
- 深入理解javascript执行上下文(Execution Context)
本文转自:http://blogread.cn/it/article/6178 在这篇文章中,将比较深入地阐述下执行上下文 - Javascript中最基础也是最重要的一个概念.相信读完这篇文章后,你 ...
- 深入理解JavaScript执行上下文、函数堆栈、提升的概念
本文内容主要转载自以下两位作者的文章,如有侵权请联系我删除: https://feclub.cn/post/content/ec_ecs_hosting http://blog.csdn.net/hi ...
- JS高阶---作用域与执行上下文
一句话介绍 .
- JavaScript的执行上下文,真没你想的那么难
作者:小土豆 博客园:https://www.cnblogs.com/HouJiao/ 掘金:https://juejin.im/user/2436173500265335 前言 在正文开始前,先来看 ...
- JavaScript执行上下文
变量声明.函数声明为何会提升?js执行时是如何查找变量的?JavaScript中最基本的部分——执行上下文(execution context) 什么是执行上下文? 当JavaScript代码运行,执 ...
- 了解JavaScript的执行上下文
转自http://www.cnblogs.com/yanhaijing/p/3685310.html 什么是执行上下文? 当JavaScript代码运行,执行环境非常重要,有下面几种不同的情况: 全局 ...
随机推荐
- vim的加密和解密?
vim中出现的错误提示含义: 参考: http://blog.csdn.net/u014599371/article/details/43955169 E488: trailing character ...
- P4303 [AHOI2006]基因匹配 未完成
题目 luogu 暴力60pts部分 显然如果没有出现次数==5的条件 显然是\(N_{2}\)的求lcs的模板 但是加点条件就完全不同了 思路 这个题短小精悍,不想数据结构那么傻逼无脑 我们考虑一下 ...
- RSA加密解密中pkcs1与pkcs8格式私钥互相转换
net,ios中rsa加解密使用的是pkcs1,而java使用的是pkcs8 如果是按1024取模(通常都是1024),pkcs1格式的私钥长度应该是812.如果是pkcs8的格式的密钥长度为861. ...
- hadoop项目实战--ETL--(三)实现mysql表到HIVE表的全量导入与增量导入
一 在HIVE中创建ETL数据库 ->create database etl; 二 在工程目录下新建MysqlToHive.py 和conf文件夹 在conf文件夹下新建如下文件,最后的工程目录 ...
- MVC ---- EF的安装于卸载
先卸载EF:Uninstall-Package EntityFramework -Force 在安装EF5.0:Install-Package EntityFramework –Version 5.0 ...
- Redis集群学习笔记
Redis集群学习笔记 前言 最近有个需求,就是将一个Redis集群中数据转移到某个单机Redis上. 迁移Redis数据的话,如果是单机Redis,有两种方式: a. 执行redis-cli shu ...
- 附加题找bug
private: void ReSize(int sz) { ) { return; } if(maxSize != sz) { T *arr = new T[sz]; if(arr == NULL) ...
- Oracle学习笔记(一)——并发与锁
1 并发 多用户数据库管理系统的一个主要任务是对 并发(concurrency)进行控制,即对多个用户同时访问同一数据进行控制.当缺乏有效的并发控制时,修改数据的操作就不能保证正常,从而危害数据完整性 ...
- android--------自定义Dialog之信息提示
对话框对于应用也是必不可少的一个组件,在Android中也不例外,对话框对于一些提示重要信息,或者一些需要用户额外交互的一些内容很有帮助. 自定义Dialog步骤: 1.主要创建Java类,并继承Di ...
- ajax思维导图

