js执行过程之上下文对象(Context)
在js的学习中,我们已经不满足于仅了解js的基础知识,而是开始追求更深层次的学习。因为你会发现,仅了解js的基础知识,在开发项目的过程中是远远不够的。今天就来介绍一下在js执行过程中的一些相关内容了。
JavaScript运行环境
JavaScript的运行不是像C++,Java等编译语言编译后直接在操作系统上运行,因为它是脚本语言,运行时必须要借助引擎来运行,所以它可以在封装了引擎的环境下运行。而当js运行时,它会有不同的运行环境。
- Global Code -- JavaScript代码开始的默认运行环境
- Function Code -- 代码执行在JavaScript函数中
- Eval Code -- 使用eval()执行代码
JavaScript运行过程
Js的执行过程可分为两个重要的时期预编译期(预解析期)和执行期。
- 预编译期
- 浏览器的JavaScript引擎“解析”js代码
- 建立arguments对象,函数,参数,变量
- 建立作用域链
- 确定this的指向
- 执行期
按照从上到下的顺序执行代码。
执行上下文
概念
如何区分不同的运行环境,需要引出的一个概念就是执行上下文(Execution Context)。它是一个对象,由js的执行引擎创建,具有三个属性:变量对象(variable object),作用域链(scope chain),this指针。
上下文栈
js在执行过程中会有一个上下文栈,上下文栈中存放的就是不同的上下文对象(你可以理解为不同的js运行环境)。比如当js开始执行一个函数,那此时它的运行环境从原来的Global Code变为Function Code,js引擎会创建一个context对象,并将其压如栈中。当这个函数执行完后,这个对象将会弹出。故而,当前执行代码的context对象总是在栈顶。
var a = 1;
function plus(a, b) {
var c;
c = a + b;
return c;
};
plus(1, 2);
function minus() {
var d = 3;
function get() {
var e = 4;
return e;
}
return d - get();
};
minus();
变量对象
变量对象是context对象中的一个重要属性,其创建过程如下:
- 创建arguments对象,其中保存有多个属性,属性的key值是'0','1','2'......,value值就是传入的参数的实际值。
- 找到这个作用域内的所有var和function的声明,作为属性存储在变量对象中,如果是function,那属性名就是函数名,属性值是函数的引用。如果是var,那属性名就是变量名,属性值是undefined.
理解了变量对象创建的过程,你就可以理解为什么会有变量提升这个特性了。
console.log(a); // undefined
var a = 1;
以上代码预解析后的实际过程可理解为:
var a;
console.log(a);
a =1
function声明的函数也是一样的原理:
f(); // 1
function f() {
var a = 1;
console.log(a);
}
以上代码预解析后的实际过程可理解为:
function f() {
var a = 1;
console.log(a);
}
f(); // 1
既然var声明和function声明都具有变量提升的特性,那var和function哪一个的声明在前呢?其实从上面的变量对象的创建过程中我们就已经知道了,为了看的清楚,我们用函数表达式的方式来声明一个函数检测一下。
f();
var f = function (){
var a = 1;
console.log(a);
};
function f(){
var b = 2;
console.log(b);
};
f();

控制台打印效果
显然是function的声明在前。
看了变量对象的创建过程,是不是觉得它和js执行过程中预编译期的第2步非常相似。没错,其实在js的预编译时期所做的工作实际上就是创建Global Execution Context的过程。它的第2步,就是context对象中创建变量对象的过程。
看到这里,是不是又有一个新的疑惑,为什么在最初的时候我们是在代码还没有开始执行的时候就已经创建了Global Execution Context对象,而之后是在要执行函数之前,才创建context对象呢?需要理解的一点就是函数体的预解析发生在函数被调用之时,被调用时先进行函数体的预编译,然后按顺序进行执行。
如果这段js代码是运行在浏览器端的,那么你猜到此时的Gobal Execution Context中的变量对象是什么了吗?没错,它就是window对象。但是当它是运行在服务器端的时候,全局上下问的变量对象却不是它的全局对象global。为什么呢?各位可爱的读者可以自己来探索一下哦。
js执行过程之上下文对象(Context)的更多相关文章
- js执行过程
正如我们了解的一样,当我们书写了JS程序之后,打开浏览器,我们的代码就可以开始运行了(当然保证你的代码没有问题,才能按照你的预期进行执行).刚才说的是JS执行的一个大的环境,今天我们学习一下,JS在解 ...
- 你了解JS执行过程吗?
正如我们了解的一样,当我们书写了JS程序之后,打开浏览器,我们的代码就可以开始运行了(当然保证你的代码没有问题,才能按照你的预期进行执行).刚才说的是JS执行的一个大的环境,今天我们学习一下, ...
- 图文带你看懂JavaScritpt引擎V8与JS执行过程
浏览器原理 浏览器内核与js引擎 浏览器内核又称"排版引擎","渲染引擎","浏览器引擎",叫法很多,简单来说干的活就是将代码(HTML,X ...
- 深入学习JS执行--创建执行上下文(变量对象,作用域链,this)
一.介绍 本篇继上一篇深入理解js执行--单线程的JS,这次我们来深入了解js执行过程中的执行上下文. 本篇涉及到的名词:预执行,执行上下文,变量对象,活动对象,作用域链,this等 二.预执行 在上 ...
- 【JS】js引擎执行过程
概述 js引擎执行过程主要分为三个阶段,分别是语法分析,预编译和执行阶段,上篇文章我们介绍了语法分析和预编译阶段,那么我们先做个简单概括,如下: 语法分析: 分别对加载完成的代码块进行语法检验,语法正 ...
- (转载)js引擎的执行过程(二)
概述 js引擎执行过程主要分为三个阶段,分别是语法分析,预编译和执行阶段,上篇文章我们介绍了语法分析和预编译阶段,那么我们先做个简单概括,如下: 语法分析: 分别对加载完成的代码块进行语法检验,语法正 ...
- js执行环境相关
Js执行过程 如果一个文档中存在多个代码段 步骤一:读入第一个代码段(js引擎并非一行一行执行,而是一段一段分析执行) 步骤二:做词法分析和语法分析,有错则报语法错误(比如括号不匹配等),并跳转到步骤 ...
- 深入学习JS执行--单线程的JS
一.介绍 随着js不断学习,你可能会慢慢的好奇,用了这么久的js,却不知道这js在浏览器怎么被执行的,很尴尬.所以,我查阅很多资料来总结JS的执行过程,也分享出来,和大家一起学习. 本篇主要讲单线程的 ...
- 深入浅出的JS执行机制(图文教程)
前序 作为一个有理想有抱负的前端攻城狮,想要走向人生巅峰,我们必须将我们使用的功法练到天人合一的地步.我在们日常工作中,使用最多的语言就是JavaScript了,为了写出完美的.能装逼的代码,我们必须 ...
- javascript代码解释执行过程
javascript是由浏览器解释执行的脚本语言,不同于java c,需要先编译后运行,javascript 由浏览器js解释器进行解释执行,总的过程分为两大块,预编译期和执行期 下面的几个demo解 ...
随机推荐
- Nginx获取用户真实IP
Nginx获取用户真实IP地址 本人在一次项目中,使用Nginx需要获取到用户IP,本来可以很常规的获取的,可现实往往不常规,项目是前后端分离的,部署时,前端使用了Nginx进行了代理并转发,后端也使 ...
- 【JMeter】JMeter添加插件
JMeter添加插件 目录 JMeter添加插件 一.前言 二.插件管理器 三.推荐插件 1.Custom Thread Groups (1)Ultmate Thread Group (2)Stepp ...
- 2021-3-9 xml序列化和反序列化
class XmlHelp { #region 调用 /// <summary> /// xml添加 /// </summary> /// <param name=&qu ...
- MQ消息队列篇:三大MQ产品的必备面试种子题
MQ有什么用? MQ(消息队列)是一种FIFO(先进先出)的数据结构,主要用于实现异步通信.削峰平谷和解耦等功能.它通过将生产者生成的消息发送到队列中,然后由消费者进行消费.这样,生产者和消费者之间就 ...
- Azure Terraform(十四)Azure Key Vault 的机密管理
一,引言 最近有网友私信我,将 Terraform 部署到 Azure 是一种将基础结构作为代码进行管理的好方法,但是如何使用 Azure Key Vault 来存储我们的 Secret ?在这篇博文 ...
- 社区活动 | “中文 AI 微小说大赛”正式开启报名!
️ 我们要求每位参赛选手以 LLM (大语言模型)为工具,将 AI 的能力与选手的创作才华相结合,创造出引人入胜.感人至深或充满疯狂的微小说! 无论你是首次接触 AI 工具还是资深的从业者,我们期待在 ...
- HTTP请求时哪些请求头是默认携带的?
提起HTTP的请求头和响应头总是一头雾水,因为总是看上去一大堆,好多还不知道是什么意思. 今天我们先研究请求头,我就想,如果我们能弄清楚,在我们什么都不做的情况下,一个最简单的HTTP请求会携带哪些请 ...
- form 表单恢复初始数据
1 表单数据的保存和恢复方法 1.1 前端数据保存方法 在前端,我们可以使用两种方法来保存表单数据:LocalStorage 和 Cookie. 使用 LocalStorage 保存数据:LocalS ...
- 红帽RHCE考题总结练习(8.0 ansible)
本文是红帽RHCE考题的总结,个别题目写了多种步骤. 一.安装和配置ansible 题目: 按照下方所述,在控制节点 bastion.lab.example.com 上安装和配置 Ansible: 安 ...
- AT_agc064_a题解
题面 题目大意 给定一个正整数 \(N\),要求构造一个序列.对于每一个在 \(1\) 到 \(N\) 之间的整数 \(i\),序列中包含了 \(i\) 个,并且将该序列首尾相接拼成环后,相邻两项之差 ...