在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. Java stream流使用

    1.使用filter()过滤List //查找身高在1.8米及以上的学生 List<StudentInfo> boys = studentList.stream().filter(s-&g ...

  2. 工作笔记--简单网线连接,使另一台设备通过笔记本电脑的wifi上网

    条件 笔记本电脑能够通过 wifi 上网 另一台与笔记本电脑网线连接正常 配置固定 ip,使之可以互相 ping 通 操作 点击右下角 wifi 图标,点击[网络和 Internet 设置] 在高级网 ...

  3. Django: 获取头信息

    如何获取请求头信息 使用如下函数request.META.get("HTTP_请求头函数"),需要注意的是,请求头变量需要全部大写. 其他注意事项如下所示: 如果headerkey ...

  4. 论文解读(DWL)《Dynamic Weighted Learning for Unsupervised Domain Adaptation》

    [ Wechat:Y466551 | 付费咨询,非诚勿扰 ] 论文信息 论文标题:Dynamic Weighted Learning for Unsupervised Domain Adaptatio ...

  5. 服务端apk打包教程

    本文我将给大家介绍一个 apk 打包工具 VasDolly 的使用介绍.原理以及如何在服务端接入 VasDolly 进行服务端打渠道包操作. 使用介绍 VasDolly 是一个快速多渠道打包工具,同时 ...

  6. 知识图谱(Knowledge Graph)- Neo4j 5.10.0 Desktop & GraphXR 连接自建数据库

    #输入查看数据库连接 neo4j$ :server status 添加 远程连接,输入连接地址 Graph Apps 选择 GraphXR 打开 显示

  7. python机器学习经典算法代码示例及思维导图(数学建模必备)

    最近几天学习了机器学习经典算法,通过此次学习入门了机器学习,并将经典算法的代码实现并记录下来,方便后续查找与使用. 这次记录主要分为两部分:第一部分是机器学习思维导图,以框架的形式描述机器学习开发流程 ...

  8. 【微信自动化】使用c#实现微信自动化

    引言 上个月,在一个群里摸鱼划水空度日,看到了一个老哥分享的一个微信自动化的一个类库,便下载了他的Demo,其本意就是模拟鼠标来操作UI,实现UI自动化:然后自己在瞎琢磨研究,写了一个简单的例子,用来 ...

  9. 《Linux基础》04. 用户管理 · 用户组 · 相关文件 · 权限管理

    @ 目录 1:用户管理指令 1.1:添加用户 1.2:修改用户密码 1.3:用户切换与注销 1.4:删除用户 1.5:查询用户信息 1.6:查看当前登录用户 1.7:查看有哪些用户 2:用户组指令 2 ...

  10. Vue.js 官方脚手架 create-vue 是怎么实现的?

    Vue.js 官方脚手架 create-vue 是怎么实现的? 摘要 本文共分为四个部分,系统解析了vue.js 官方脚手架 create-vue 的实现细节. 第一部分主要是一些准备工作,如源码下载 ...