执行上下文

执行上下文概念

  • 当代码运行时,会产生一个对应的执行环境,在这个环境中,变量会被事先提出来(变量提升),代码从上往下开始执行,就叫做执行上下文。

注:在定义变量是未直接赋值,使用默认值 undefined。

在 JavaScript 的世界里,运行环境有三种,分别是:

  1. 全局环境:代码首先进入的环境
  2. 函数环境:函数被调用时执行的环境
  3. Eval的代码 - 在Eval函数内运行的代码

执行上下文特点

  1. 单线程,在主进程上运行

  2. 同步执行,从上往下按顺序执行

  3. 全局上下文只有一个,浏览器关闭时会被弹出栈

  4. 函数的执行上下文没有数目限制

  5. 函数每被调用一次,都会产生一个新的执行上下文环境

执行上下文栈

  执行全局代码时,会产生一个执行上下文环境,每次调用函数都又会产生执行上下文环境。当函数调用完成时,这个上下文环境以及其中的数据都会被消除,再重新回到全局上下文环境。处于活动状态的执行上下文环境只有一个。

执行上下文生命周期

执行上下文共分3个阶段,分别是:

  1. 创建阶段

     1. 生成变量对象(全局对象)

     2. 建立作用域链

     3. 确定 this 指向

  2. 执行阶段

     1.变量调用赋值

     2.函数引用,创建新的执行上下文环境

     3.执行其他代码

  3. 销毁阶段

执行完毕退出执行栈,等待回收被销毁

变量对象

  • 变量对象是与执行上下文相关的数据作用域,存储了上下文中定义的变量和函数声明。

  • 变量对象式一个抽象的概念,在不同的上下文中,表示不同的对象:

  1. 全局执行上下文的变量对象
  •   全局执行上下文中,变量对象就是全局对象。
  •   在顶层js代码中,this指向全局对象,全局变量会作为该对象的属性来被查询。在浏览器中,window就是全局对象。
  1. 函数执行上下文的变量对象
  •   函数上下文中,变量对象VO就是活动对象AO。
  •   初始化时,带有arguments属性。
  •   函数代码分成两个阶段执行
  •   进入执行上下文时,此时变量对象包括
  •   形参
  •   函数声明,会替换已有变量对象
  •   变量声明,不会替换形参和函数
  •   函数执行

列子

var a = 1, b, fn = function() {
console.log(a)
var a = 3,b = 2;
bar(b)
}
var bar = function(x) {
return x + 4;
}
fn()
  • 执行结果 undefined
  • JS 是单线程,从上到下执行每一行代码
  1. 创建变量a并赋值1,变量b 没有赋值,使用 undefined 默认值,fn 赋值函数,bar 赋值函数
  2. 调用 fn(), fn 进入执行栈,创建新的 fn 内部执行上下文。打印 a 此时 在 fn作用域内,定义了一个新的变量 a,但是在使用a是 a并没有赋值,所以 打印a, 输出:undefined。代码向下执行,a,b分别赋值。调用函数bar()
  3. 函数bar进入执行栈,开始执行, 返回结果,出栈内部等待销毁回收。
  4. fn() 退出执行栈,等待销毁回收
  5. 回到全局执行环境(全局上下文)

JS 执行上下文的一次理解的更多相关文章

  1. JS执行上下文(执行环境)详细图解

    JS执行上下文(执行环境)详细图解 先随便放张图 我们在JS学习初期或者面试的时候常常会遇到考核变量提升的思考题.比如先来一个简单一点的. console.log(a); // 这里会打印出什么? v ...

  2. 一篇文章看懂JS执行上下文

     壹 ❀ 引 我们都知道,JS代码的执行顺序总是与代码先后顺序有所差异,当先抛开异步问题你会发现就算是同步代码,它的执行也与你的预期不一致,比如: function f1() { console.lo ...

  3. 深入理解js——执行上下文

    什么是"执行上下文"?暂且不下定义,先看一段代码: 第一句报错,a未定义,很正常.第二句.第三句输出都是undefined,说明浏览器在执行console.log(a)时,已经知道 ...

  4. js 执行上下文理解

    前端基础进阶(三):变量对象详解http://www.jianshu.com/p/330b1505e41d 1.创建阶段 a.生成变量对象    1.创建arguments对象   2.functio ...

  5. js执行上下文(由浅入深)

    每一个函数都有自己的执行上下文EC(执行环境 execution context),并且每个执行上下文中都有它自己的变量对象VO(Variable object),用于存储执行上下文中的变量 .函数声 ...

  6. 【repost】 原生JS执行环境与作用域深入理解

    首先,我们要知道执行环境和作用域是两个完全不同的概念. 函数的每次调用都有与之紧密相关的作用域和执行环境.从根本上来说,作用域是基于函数的,而执行环境是基于对象的(例如:全局执行环境即window对象 ...

  7. 前端高质量知识(二)-JS执行上下文(执行环境)详细图解Script

    先随便放张图 我们在JS学习初期或者面试的时候常常会遇到考核变量提升的思考题.比如先来一个简单一点的. console.log(a); // 这里会打印出什么? var a = 20; PS: 变量提 ...

  8. 原型模式故事链(4)--JS执行上下文、变量提升、函数声明

    上一章:JS的数据类型 传送门:https://segmentfault.com/a/11... 好!话不多少,我们就开始吧.对变量提升和函数声明的理解,能让你更清楚容易的理解,为什么你的程序报错了~ ...

  9. js执行上下文与执行上下文栈

    一.什么是执行上下文 简单说就是代码运行时的执行环境,必须是在函数调用的时候才会产生,如果不调用就不会产生这个执行上下文.在这个环境中,所有变量会被事先提出来(变量提升),有的直接赋值,有的为默认值 ...

随机推荐

  1. 编程题:X星人的金币

    X星人的金币 时问限制:3000MS 内存限制:589824KB 题目描述: X是人在一艘海底沉船上发现了很多很多很多金币.可爱的X星人决定用这些金币来玩一个填格子的游戏.其规则如下:第1个格子放2枚 ...

  2. [no_code][Beta] 中期组内总结

    $( "#cnblogs_post_body" ).catalog() 目前scrum meeting beta阶段目前共7次.在alpha阶段我们博客发布时间比较匆忙,是扣分项, ...

  3. git为单独的仓库设置提交的用户名

    在我们平时的学习中可能有这么一种需求,在公司进行开发的时候,一般会参与多个项目的开发,而项目提交代码时,一般请求情况下提供的用户都是同一个,而我们为了方便可能会使用全局进行git 用户名的配置.但是空 ...

  4. 常见SOC启动流程分析

    本文以s5pv210这款SOC为例,分析了其启动流程 在s5pv210的SOC内部,存在着一个内部的ROM和一个内部的RAM 这个内部的ROM叫做 IROM,它是norflash的一种.其不同于板子上 ...

  5. Apache Kafka 学习笔记

    1. 介绍Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据. 这种动 ...

  6. IdentityServer4 负载均衡配置

    在不用到负载之前,一切都很好,但是部署多个实例之后,问题挺多的:session问题.令牌签发后的校验问题. 在此之前,先自查官方文档:Deployment - IdentityServer4 1.0. ...

  7. 近期业务大量突增微服务性能优化总结-4.增加对于同步微服务的 HTTP 请求等待队列的监控

    最近,业务增长的很迅猛,对于我们后台这块也是一个不小的挑战,这次遇到的核心业务接口的性能瓶颈,并不是单独的一个问题导致的,而是几个问题揉在一起:我们解决一个之后,发上线,之后发现还有另一个的性能瓶颈问 ...

  8. GitHub 开源的小工具「GitHub 热点速览 v.21.45」

    作者:HelloGitHub-小鱼干 Copilot 是 GitHub 官方出品的代码自动补全工具,之前使用该工具需要有一定的要求.而本周靠 2k+ star 上热点的 copilot-docs 则是 ...

  9. RedHat 7.0 下 FTP 服务的安装,启动,配置,以及虚拟用户的建立

    (注意! 区分shell命令和往配置文件里加的代码不同) 一:ftp服务的安装,启动和启用.   1:vim /etc/sysconfig/selinux     改为disabled后重启     ...

  10. 攻防世界 WEB 高手进阶区 NSCTF web2 Writeup

    攻防世界 WEB 高手进阶区 NSCTF web2 Writeup 题目介绍 题目考点 php基本函数语法 加密解密函数 base64_decode().str_rot13() 字符串反转函数 str ...