function test(){
console.log(a);//undefined;
var a = 1;
}
test();

也许你会遇到过上面这样的面试题,你只知道它考的是变量提升,但是具体的原理又知道吗?所以我觉得很有必要搞明白底层的原理,才能加深理解,其实围绕的就是执行上下文的概念。

什么是执行上下文?

当控制器转到可执行的代码时,会进入该代码对应的执行上下文,可以理解为该代码对应的一个执行环境,就叫做执行上下文。

在JavaScript中运行环境有三种,分别是:

  • 全局环境:JavaScript代码执行起来,首先就是进入全局环境。
  • 函数环境:当函数被调用执行时,就会进入函数中执行。
  • eval

所以在一个JavaScript程序中,就会产生多个不同的执行上下文,这时候就需要用到前面提到的数据结构来管理了,我们称之为调用栈。当代码在执行过程中,遇到上面说的三种情况,就会产生三种执行上下文,然后分别压入调用栈中,等一个执行上下文执行完毕,弹出栈,才能执行下一个执行上下文中的代码,这就是栈结构的特点。

执行上下文的特点

  • 单线程,其实javascript就是单线程,所以很好理解。
  • 同步执行,同步就是按顺序,不能同时执行。
  • 全局上下文只有一个,它在浏览器关闭时才会弹出栈。
  • 函数的执行上下文的数目没有限制。
  • 每次某个函数被调用时,就会有新的执行上下文,即使是调用的自身函数。
demo01
function f1(){
var n = 999;
function f2(){
alert(n);
}
return f2;
}
var result = f1();
result();//

我以上面这样一个例子讲解,执行上下文调用栈中的创建过程

执行上下文的生命周期

如图所示,主要分为两个阶段,一个是创建阶段,一个是执行阶段

创建阶段:
  • 生成变量对象,后面会讲解
  • 建立作用域链
  • 确定this指向
执行阶段:
  • 变量赋值
  • 函数引用
  • 执行其他代码
执行完毕后弹栈,等待回收

变量对象和活动对象的区别就在于,执行周期不一样,在创建阶段叫做变量对象,在执行阶段叫做活动对象。

变量对象

变量对象的创建主要有三个阶段:

  • 1、创建arguments对象。
  • 2、检查function函数声明创建属性。在VO对象中以函数名建立一个属性,属性值为函数的地址。如果函数名的属性已经存在了,那么该属性将会被新的引用所覆盖。
  • 3、检查var变量声明创建属性。在VO对象中以变量名建立一个属性,属性值为undefined。为了防止同名的属性值会被修改为undefined,则会直接跳过,原属性值不会被修改。

举个变量提升和函数提升的例子,就明白了

demo02
function test(){
console.log(a);
console.log(foo());
var a = 1;
function foo(){
return 2;
}
}
test();

这是一个典型的变量提升和函数提升的例子,最后会输出undefined和2,接下来以执行上下文的生命周期来讲解,

创建过程
testEC = {
VO:{},
scopeChain:{},
this:{}
}
VO = {
arguments:{},
foo:<foo reference>,
a:undefined
}
执行阶段
VO->AO
AO={
arguments:{},
foo:<foo reference>,
a:2
}
等同于
function test(){
function foo(){
return 2;
}
var a;
console.log(a);
console.log(foo());
a = 1;
}
test();

通过上面知识的讲解,进一步了解到了变量提升和函数提升的底层原理,对后面知识的学习也做了铺垫。

参考:  https://www.cnblogs.com/mcray/p/7003245.html

JS 上下文模式的更多相关文章

  1. 浅谈JS严格模式

    浅谈JS严格模式 简介 何为严格模式?严格模式(strict mode)即在严格的条件下运行,在严格模式下,很多正常情况下不会报错的问题语句,将会报错并阻止运行. 但是,严格模式可以显著提高代码的健壮 ...

  2. [WCF编程]7.实例上下文模式

    一.实例上下文模式概述 实例上下文(IntanceContext Mode)表示服务端的服务实例与客户端的服务代理的绑定方式. 在实例化服务器对象时,WCF采用了3种不同的模式:单调(Per-Call ...

  3. WCF实例上下文模式与并发模式对性能的影响

    实例上下文模式 InstanceContextMode 控制在响应客户端调用时,如何分配服务实例.InstanceContextMode 可以设置为以下值: •Single – 为所有客户端调用分配一 ...

  4. js严格模式“use strict”

    js的严格模式会放弃js中的一些不正规的写法,参考 http://www.cnblogs.com/God-Shell/p/3139329.html: 使用声明"use  strict&quo ...

  5. js调试模式控制台输出信息

    js调试模式控制台输出信息.console.log

  6. JS工厂模式开发实践

    JS工厂模式开发实践 基于JS工厂模式的H5应用,实现了轮播图功能与滑屏功能,并且实现了文字大小的自适应功能,基于SASS样式开发. 核心的JS代码如下: index.js define(functi ...

  7. js组合模式

    组合模式(Composite),将对象组合成树形结构以表示‘部分-整体’的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 透明方式,也就是说在Commponent中声明所有用来管理子 ...

  8. JS命令模式个人理解

    JS命令模式个人理解 //BODY部分<body> <button id="execute">打开电视</button> <button ...

  9. 鸿蒙的js开发部模式16:鸿蒙布局Grid网格布局的应用一

    鸿蒙入门指南,小白速来!从萌新到高手,怎样快速掌握鸿蒙开发?[课程入口]目录:1.Grid简介2.使用Grid布局实现的效果3.grid-row-gap和grid-colunm-gap属性4.< ...

随机推荐

  1. 设计模式之Interpreter(解释器)(转)

    Interpreter定义: 定义语言的文法 ,并且建立一个解释器来解释该语言中的句子. Interpreter似乎使用面不是很广,它描述了一个语言解释器是如何构成的,在实际应用中,我们可能很少去构造 ...

  2. Hadoop常用命令总结

    一.前述 分享一篇hadoop的常用命令的总结,将常用的Hadoop命令总结如下. 二.具体 1.启动hadoop所有进程start-all.sh等价于start-dfs.sh + start-yar ...

  3. API网关性能比较:NGINX vs. ZUUL vs. Spring Cloud Gateway vs. Linkerd(转)

    前几天拜读了 OpsGenie 公司(一家致力于 Dev & Ops 的公司)的资深工程师 Turgay Çelik 博士写的一篇文章(链接在文末),文中介绍了他们最初也是采用 Nginx 作 ...

  4. Vue 基础精讲

    Vue 基础精讲 Vue 官方文档:https://cn.vuejs.org/v2/guide/ VUE 实例 每个组件都是一个 vue 的实例. 一个 vue 项目是由实例组成的. vue 实例上有 ...

  5. Nginx:论高并发,在座各位都是渣渣

    NGINX 在网络应用中表现超群,在于其独特的设计.许多网络或应用服务器大都是基于线程或者进程的简单框架,NGINX突出的地方就在于其成熟的事件驱动框架,它能应对现代硬件上成千上万的并发连接. NGI ...

  6. 使用Excel批量给数据添加单引号和逗号

    表格制作过程如下: A2表格暂时为空,模板建立完成以后,用来放置原始数据: 在B2表格内输入公式:  ="'"&A2&"'"&" ...

  7. sed/awk advance

    $ echo test.file [Group1]cacheways = 19 [Group2]cacheways = 19 $ ls test.sh FILE=test.file2 # Set Gr ...

  8. oracle审计例子

    1.数据库开启审计alter system set audit_trail=db,extended scope=spfile;shutdown immediatestartup 2.对某个表进行审计c ...

  9. opencv学习之路(16)、膨胀腐蚀应用之走迷宫

    一.分析 贴出应用图片以供直观了解 红色部分,因图而异(某些参数,根据图片的不同需要进行相应的修改) 二.代码 #include "opencv2/opencv.hpp" #inc ...

  10. linux 中部署 rsync 实现文件远程备份及 同步

    客户端:数据源:服务端:数据接收方 rsync官方文档:https://www.samba.org/ftp/rsync/rsync.html 手动测试用“通过远程外壳访问"里的语法: 参考1 ...