博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js 执行上下文
阅读量:6971 次
发布时间:2019-06-27

本文共 1848 字,大约阅读时间需要 6 分钟。

hot3.png

如果要问到 JavaScript 代码执行顺序的话,想必写过 JavaScript 的开发者都会有个直观的印象,那就是顺序执行,毕竟:

var foo = function () {    console.log('foo1');}foo();  // foo1var foo = function () {    console.log('foo2');}foo(); // foo2

上面代码:变量提升

function foo() {    console.log('foo1');}foo();  // foo2function foo() {    console.log('foo2');}foo(); // foo2

上面代码:函数提升

 

但接下来要思考的是:

JavaScript 引擎并非一行一行地分析和执行程序,而是一段一段地分析执行。当执行一段代码的时候,会进行一个“准备工作”,比如第一个例子中的变量提升,和第二个例子中的函数提升。

但是本文真正想让大家思考的是:这个“一段一段”中的“段”究竟是怎么划分的呢?

到底JavaScript引擎遇到一段怎样的代码时才会做“准备工作”呢?

可执行代码

这就要说到 JavaScript 的可执行代码(executable code)的类型有哪些了?

其实很简单,就三种,全局代码、函数代码、eval代码。

举个例子,当执行到一个函数的时候 比如 f(),就会进行准备工作,这里的“准备工作”,让我们用个更专业一点的说法,就叫做"执行上下文(execution context)"。   ( 碰到函数执行,就创建一个执行上下文

执行上下文栈

接下来问题来了,我们写的函数多了去了,如何管理创建的那么多执行上下文呢?

所以 JavaScript 引擎创建了执行上下文栈(Execution context stack,ECS)来管理执行上下文

为了模拟执行上下文栈的行为,让我们定义执行上下文栈是一个数组:  

ECStack = [];

试想当 JavaScript 开始要解释执行代码的时候,最先遇到的就是全局代码,所以初始化的时候首先就会向执行上下文栈压入一个全局执行上下文,我们用 globalContext 表示它,并且只有当整个应用程序结束的时候,ECStack 才会被清空,所以程序结束之前, ECStack 最底部永远有个 globalContext:

ECStack = [    globalContext];

现在 JavaScript 遇到下面的这段代码了:

function fun3() {    console.log('fun3')}function fun2() {    fun3();}function fun1() {    fun2();}fun1();

执行一个函数的时候,就会创建一个执行上下文,并且压入执行上下文栈,当函数执行完毕的时候,就会将函数的执行上下文从栈中弹出。

现在 JavaScript 遇到下面的这段代码了:

function fun3() {    console.log('fun3')}function fun2() {    fun3();}function fun1() {    fun2();}fun1();

执行一个函数的时候,就会创建一个执行上下文,并且压入执行上下文栈,当函数执行完毕的时候,就会将函数的执行上下文从栈中弹出。知道了这样的工作原理,让我们来看看如何处理上面这段代码:

// 伪代码// fun1()ECStack.push(
functionContext);// fun1中竟然调用了fun2,还要创建fun2的执行上下文ECStack.push(
functionContext);// 擦,fun2还调用了fun3!ECStack.push(
functionContext);// fun3执行完毕ECStack.pop();// fun2执行完毕ECStack.pop();// fun1执行完毕ECStack.pop();// javascript接着执行下面的代码,但是ECStack底层永远有个globalContext

 

转载于:https://my.oschina.net/u/560237/blog/3023197

你可能感兴趣的文章
jmeter+ant+jenkins
查看>>
Linux基础命令---grep
查看>>
Linux基础命令---cancel取消打印任务
查看>>
理解ORACLE数据库字符集
查看>>
Top Coder算法题目浏览器
查看>>
为SharePoint 2016 配置SQL 2016的always on 模式(二)
查看>>
PHP 选择排序法
查看>>
使用css3做立体效果!
查看>>
CIO的管理经
查看>>
ssh故障解决一例
查看>>
linux学习笔记-第十一课-shell基础
查看>>
当Ctrl+Alt+Del失效时,你需要用net user 来改密码
查看>>
C++的变量作用域
查看>>
ES搭建
查看>>
长sql与sql执行进度
查看>>
Java命名规范
查看>>
Openwrt通过tc,iptalbes限速
查看>>
get_hard_info.sh
查看>>
从0开始
查看>>
腾讯网络技术TGW
查看>>