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代码运行,执行环境非常重要,有下面几种不同的情况: 全局 ...
随机推荐
- HDU 4135 Co-prime(容斥:二进制解法)题解
题意:给出[a,b]区间内与n互质的个数 思路:如果n比较小,我们可以用欧拉函数解决,但是n有1e9.要求区间内互质,我们可以先求前缀内互质个数,即[1,b]内与n互质,求互质,可以转化为求不互质,也 ...
- bam/sam格式说明--转载
在SAM输出的结果中每一行都包括十二项通过Tab分隔,从左到右分别是: 1 序列的名字(Read的名字) 2 概括出一个合适的标记,各个数字分别代表 1 序列是一对序列中的一个 2 比 ...
- Linux——文件搜索命令简单笔记
一: 命令名称:which 命令所在路径:/usr/bin/which 执行权限:所有用户 功能描述:显示系统命令所在目录 范例:$ which ls 还有一个whereeis ls 命令 二: 命令 ...
- hdu 3579 Hello Kiki 不互质的中国剩余定理
Hello Kiki Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Probl ...
- 使用docker安装myql/redis等软件
使用docker安装myql/redis等软件 概述 基本命令 安装mysql 安装redis 概述 在开发时经常需要安装各种软件,有时甚至为了验证一个命令不得不安装配置一个缓存.数据库.MQ等,耽误 ...
- ESXi6.7安装流程和bug处理
·前言 ·准备工作 ·安装 ·Initializing IOV卡住 ·缺少网卡驱动 ·安装ESXi6.7 ·Multiboot could not setup the video subsystem ...
- C# 中的浅表副本与深表副本
public class Student { public int age; public Student(int age) { this.age = age; } } public class Gr ...
- Java-Java程序设计的基本概念
2017-10-06 15:31:39 一.Java程序的基本构成 二.数据类型与标识符 数据类型 标识符 广义的用于定义各种对象名称的字符串集合称为标识符,标识符一般分为用户 ...
- php7 编译 win32ps 模块
碰到了很多问题 ,但最终都解决了,感觉不错. 1)下载 php source, php sdk, 以及 win32ps的源代码 2) 参照下面的连接进行编译. https://wiki.php.net ...
- Enter键实现按钮相同功能
1.在所在的按钮(Enter键功能)的容器上加上onkeydown="saveForKeyDown()",通常加载body上 <!-- 添加窗口--> <div ...

