在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. Node版本更新及切换

    Node版本升级 # 清除npm缓存 npm cache clean -f # n模块是专门用来管理nodejs的版本,安装n模块 npm install -g n 1.Windows 由于n命令是在 ...

  2. Cilium 系列-3-Cilium 的基本组件和重要概念

    系列文章 Cilium 系列文章 前言 安装完了,我们看看 Cilium 有哪些组件和重要概念. Cilium 组件 如上所述,安装 Cilium 时,会安装几个运行组件(有些是可选组件), 它们各是 ...

  3. PostgreSQL 10 文档: PostgreSQL 客户端工具

    PostgreSQL 客户端应用   这部份包含PostgreSQL客户端应用和工具的参考信息.不是所有这些命令都是通用工具,某些需要特殊权限.这些应用的共同特征是它们可以被运行在任何主机上,而不管数 ...

  4. 西门子PS on eMS Standalone《导入FANUC机器人TP程序》

    导入TP程序到PDPS中 右键点击左侧项目树的 "程序" --> 点击 "创建TP程序" 打开示教器 --> 点击"SELECT" ...

  5. 《深入理解Java虚拟机》读书笔记:判断对象是否存活

    本节内容的概要如下; 对象已死吗? 一.判断对象是否存活的算法 1.引用计数器算法 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0 ...

  6. [ABC132D] Blue and Red Balls

    2023-01-16 题目 题目传送门 翻译 翻译 难度&重要性(1~10):3 题目来源 AtCoder 题目算法 dp 解题思路 因为蓝球的数量是固定的,题目让我们求,在取 \(i\) 次 ...

  7. MAUI+Blazor混合应用开发示例

    前言 笔者之前在公司搭建过一套生产管理系统,该系统要求能和硬件进行串口通信,同时又要提供后台信息查询.笔者给出的解决方案就是:MAUI + Blazor,这样只需要提供一套UI,就能满足桌面端.移动端 ...

  8. doris单机安装部署

    原文出处 doris单机安装部署 下载Doris 环境要求 Linux系统:Centos7.x或Ubantu16.04及以上版本 Java运行环境: JDK8 java -version 在windo ...

  9. 了解 HarmonyOS

    引言 在开始 HarmonyOS 开发之前,了解其背景.特点和架构是非常重要的.本章将为你提供一个全面的 HarmonyOS 概览. 目录 什么是 HarmonyOS HarmonyOS 的发展历程 ...

  10. from itertools import groupby

    需求:期望由 a 得到 b 实现方法: from itertools import groupby a = [ {'name': 'a', 'value': 1}, {'name': 'b', 'va ...