JavaScript 是如何工做的系列——第三篇
在上篇文章《JavaScript 引擎(V8)是如何工做的》中,咱们介绍了 JavaScript 引擎(V8)是如何执行 JavaScript 代码的。本篇文章将开始介绍 JavaScript 执行机制中的核心概念——执行上下文。javascript
执行上下文(Execution Context),也称为执行环境,就是当前 JavaScript 代码执行时所在环境的抽象概念。前端
每当开始执行代码时,JavaScript 引擎会为整个程序建立一个执行上下文(全局执行上下文),JavaScript 代码都是在执行上下文中运行的。java
在 JavaScript 中,执行环境主要分为:git
咱们看一个例子:github
var a = 'Hello World!' function helloWorld () { var a = 'Hello Function!' console.log(a) } helloWorld() console.log('a)
上述代码,建立的执行上下文结构以下图所示:segmentfault
显而易见,在一个 JavaScript 程序中,一般状况下都会存在多个执行上下文,那么这些执行上下文是如何管理的呢?数组
JavaScript 引擎建立了执行上下文栈(Execution Context Stack) 来管理执行上下文。浏览器
首先咱们来了解下什么是栈数据结构?数据结构
栈中数据的存取方式相似给枪上子弹,先上的子弹最后打出,后上的子弹先打出。
特色:先进后出,后进先出函数
了解了栈数据结构后,咱们继续来讲执行上下文栈是如何管理执行上下文的?
咱们用数组来模拟执行上下文栈的行为:ECStack = [];
。
function fn2() { console.log('fn2') } function fn1() { console.log('fn1') fn2(); } fn1();
上述这段代码在执行过程当中,执行上下文栈的行为是什么样的?咱们来分析一下:
ECStack.push(global_EC);
ECStack.push(fn1_EC);
ECStack.push(fn2_EC);
ECStack.pop();
ECStack.pop();
ECStack.pop();
总结:
在每一个执行上下文中,都包括三个重要的属性:(ES3版,ES5后作了一些变动,具体变化内容后续会写文章总结)
伪代码以下:
global_EC = { scopeChain: { // Current scope + scopes of all its parents }, variableObject: { // All the variables including inner variables & functions, function arguments }, this: {} }
下篇文章将开始介绍 JavaScript 的做用域,以及执行上下文中的做用域链,敬请期待。
参考:
JavaScript深刻之执行上下文
前端基础进阶(二):执行上下文详细图解
JS 执行环境、做用域链、活动对象
The Journey of JavaScript From Downloading Scripts to Execution – Part III