在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. 6月有奖征文挑战,ZEGO开发者社区首季活动报名入口!

    前 言 哈喽 开发者们: ZEGO即构科技作为一家20年技术积累的音视频云服务商,已经为全球200+个国家的企业服务,单日通话时长突破30亿+分钟,现下即构开发者社区举办首期征文活动!本次征文活动围绕 ...

  2. redis 中的 list

    lpush K1 V1 V2 V3   左边加入list rpush k1 v1 v2 v3 右边加入list lpop k1 左边吐出一个值 rpop k1 右边吐出一个值 lrange k1 0 ...

  3. pandas 根据内容匹配并获取索引

    bool = ExcelDataStr.str.contains("Item No./Customer/Saler") # 初始位置:initial position, 终位置:e ...

  4. 代码随想录算法训练营第八天| LeetCode 344.反转字符串 541. 反转字符串II 151.翻转字符串里的单词

    344.反转字符串 卡哥建议: 本题是字符串基础题目,就是考察 reverse 函数的实现,同时也明确一下 平时刷题什么时候用 库函数,什么时候 不用库函数 题目链接/文章讲解/视频讲解:https: ...

  5. [FlareOn3]Challenge1

    打开直接f5,发现只有一个可疑函数 进入 base64??? base64解密

  6. Kioptrix Level 1

    Kioptrix这个系列靶机默认是桥接模式,如果我们kali使用NAT是扫描不到靶机的,通过VM的靶机网络设置也不能更改成功. 解决方式:每次下载好靶机先不导入VM,如果已经导入,需要"移除 ...

  7. COF框架集成mongodb驱动

    今天打算在我的COF框架中集成mongodb驱动,这实在是简单的工作,因为基本上只是对pymongo的封装 数据库的集成大同小异,要考虑的点无非是以下几点: 1.命名 2.连接创建 3.连接池管理 4 ...

  8. 基于ASP.NET ZERO,开发SaaS版供应链管理系统

    前言 在园子吸收营养10多年,一直没有贡献,目前园子危机时刻,除了捐款+会员,也鼓起勇气,发篇文助力一下. 2018年下半年,公司决定开发一款SaaS版行业供应链管理系统,经过选型,确定采用ABP(A ...

  9. Vue源码学习(二):<templete>渲染第一步,模板解析

    好家伙, 1.<template>去哪了 在正式内容之前,我们来思考一个问题, 当我们使用vue开发页面时,<tamplete>中的内容是如何变成我们网页中的内容的? 它会经历 ...

  10. Unity 性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法

    Unity 性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法 点击封面跳转下载页面 简介 Unity 性能优化Shader分析处理函数:Sha ...