在js的学习中,我们已经不满足于仅了解js的基础知识,而是开始追求更深层次的学习。因为你会发现,仅了解js的基础知识,在开发项目的过程中是远远不够的。今天就来介绍一下在js执行过程中的一些相关内容了。

JavaScript运行环境

JavaScript的运行不是像C++,Java等编译语言编译后直接在操作系统上运行,因为它是脚本语言,运行时必须要借助引擎来运行,所以它可以在封装了引擎的环境下运行。而当js运行时,它会有不同的运行环境。

  • Global Code -- JavaScript代码开始的默认运行环境
  • Function Code -- 代码执行在JavaScript函数中
  • Eval Code -- 使用eval()执行代码

JavaScript运行过程

Js的执行过程可分为两个重要的时期预编译期(预解析期)和执行期。

  • 预编译期
  1. 浏览器的JavaScript引擎“解析”js代码
  2. 建立arguments对象,函数,参数,变量
  3. 建立作用域链
  4. 确定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对象中的一个重要属性,其创建过程如下:

  1. 创建arguments对象,其中保存有多个属性,属性的key值是'0','1','2'......,value值就是传入的参数的实际值。
  2. 找到这个作用域内的所有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)的更多相关文章

  1. js执行过程

    正如我们了解的一样,当我们书写了JS程序之后,打开浏览器,我们的代码就可以开始运行了(当然保证你的代码没有问题,才能按照你的预期进行执行).刚才说的是JS执行的一个大的环境,今天我们学习一下,JS在解 ...

  2. 你了解JS执行过程吗?

        正如我们了解的一样,当我们书写了JS程序之后,打开浏览器,我们的代码就可以开始运行了(当然保证你的代码没有问题,才能按照你的预期进行执行).刚才说的是JS执行的一个大的环境,今天我们学习一下, ...

  3. 图文带你看懂JavaScritpt引擎V8与JS执行过程

    浏览器原理 浏览器内核与js引擎 浏览器内核又称"排版引擎","渲染引擎","浏览器引擎",叫法很多,简单来说干的活就是将代码(HTML,X ...

  4. 深入学习JS执行--创建执行上下文(变量对象,作用域链,this)

    一.介绍 本篇继上一篇深入理解js执行--单线程的JS,这次我们来深入了解js执行过程中的执行上下文. 本篇涉及到的名词:预执行,执行上下文,变量对象,活动对象,作用域链,this等 二.预执行 在上 ...

  5. 【JS】js引擎执行过程

    概述 js引擎执行过程主要分为三个阶段,分别是语法分析,预编译和执行阶段,上篇文章我们介绍了语法分析和预编译阶段,那么我们先做个简单概括,如下: 语法分析: 分别对加载完成的代码块进行语法检验,语法正 ...

  6. (转载)js引擎的执行过程(二)

    概述 js引擎执行过程主要分为三个阶段,分别是语法分析,预编译和执行阶段,上篇文章我们介绍了语法分析和预编译阶段,那么我们先做个简单概括,如下: 语法分析: 分别对加载完成的代码块进行语法检验,语法正 ...

  7. js执行环境相关

    Js执行过程 如果一个文档中存在多个代码段 步骤一:读入第一个代码段(js引擎并非一行一行执行,而是一段一段分析执行) 步骤二:做词法分析和语法分析,有错则报语法错误(比如括号不匹配等),并跳转到步骤 ...

  8. 深入学习JS执行--单线程的JS

    一.介绍 随着js不断学习,你可能会慢慢的好奇,用了这么久的js,却不知道这js在浏览器怎么被执行的,很尴尬.所以,我查阅很多资料来总结JS的执行过程,也分享出来,和大家一起学习. 本篇主要讲单线程的 ...

  9. 深入浅出的JS执行机制(图文教程)

    前序 作为一个有理想有抱负的前端攻城狮,想要走向人生巅峰,我们必须将我们使用的功法练到天人合一的地步.我在们日常工作中,使用最多的语言就是JavaScript了,为了写出完美的.能装逼的代码,我们必须 ...

  10. javascript代码解释执行过程

    javascript是由浏览器解释执行的脚本语言,不同于java c,需要先编译后运行,javascript 由浏览器js解释器进行解释执行,总的过程分为两大块,预编译期和执行期 下面的几个demo解 ...

随机推荐

  1. Redis设计

    目录 过期键删除策略 持久化 RDB AOF AOF重写 主从复制 完整重同步和部分重同步 哨兵Sentinel 哨兵对redis服务器集群的监听 执行者选举 故障转移 选择新的主服务器流程 过期键删 ...

  2. Linux 软件包:lvm

    lvm LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制. Linux用户安装Linux操作系统时遇到的一个常见的难以决定的 ...

  3. 【go语言】2.4.2 自定义包的创建和使用

    在 Go 中,任何一个目录都可以被视为一个包.创建自定义包的基本步骤是: 新建一个目录,用于存放包的源文件. 在新建的目录中编写 Go 代码,代码的第一行应该是 package 包名. 使用 impo ...

  4. 建设数字工厂:MRP物料需求计划的逻辑原理与配置方法

    本文分享自华为云社区<数字工厂深入浅出系列(七): MRP物料需求计划的逻辑原理与配置方法>,作者:云起MAE. MRP是生产制造企业"管好"物料的核心工具方法,基本思 ...

  5. oracle 11g手工建库步骤(初学者)

    要建立的数据库ORACLE_SID=test1sys和system的密码为oracle1.建立相应的目录mkdir /u01/app/oracle/oradata/test1mkdir /u01/ap ...

  6. Burnside 定理

    Burnside 定理 问题: 给定一个 \(n\) 个点,\(n\) 条边的环,有 \(m\) 种颜色,给每个顶点染色,问有多少种本质不同的染色方案,答案对 \(10^9+7\) 取模 注意本题的本 ...

  7. linux vim 无权限保存解决办法

    通常在vim编辑文件时往往会忘记文件权限问题, 在wq保存时发现权限不足,这时候输入以下命令解决: w! sudo tee % 命令解析: w! {cmd} 指示 保存时执行额外命令: tee 用于将 ...

  8. vxe-table中文文档

    https://xuliangzhan_admin.gitee.io/vxe-table/#/table/grid/fullEdit

  9. 【技术实战】Vue功能样式实战【七】

    需求实战一 样式展示 代码展示 <template> <transition name="fade-in" appear> <ARow v-if=&q ...

  10. 《高级程序员 面试攻略 》RocketMQ 如何保证顺序性

    RocketMQ 提供了一种称为顺序消息的机制来确保消息的顺序性.下面是一些关键的方法和概念: 1. 顺序消息:顺序消息是指在发送和消费过程中,消息按照特定的顺序进行处理.RocketMQ 通过将消息 ...