JS 上下文模式
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 上下文模式的更多相关文章
- 浅谈JS严格模式
浅谈JS严格模式 简介 何为严格模式?严格模式(strict mode)即在严格的条件下运行,在严格模式下,很多正常情况下不会报错的问题语句,将会报错并阻止运行. 但是,严格模式可以显著提高代码的健壮 ...
- [WCF编程]7.实例上下文模式
一.实例上下文模式概述 实例上下文(IntanceContext Mode)表示服务端的服务实例与客户端的服务代理的绑定方式. 在实例化服务器对象时,WCF采用了3种不同的模式:单调(Per-Call ...
- WCF实例上下文模式与并发模式对性能的影响
实例上下文模式 InstanceContextMode 控制在响应客户端调用时,如何分配服务实例.InstanceContextMode 可以设置为以下值: •Single – 为所有客户端调用分配一 ...
- js严格模式“use strict”
js的严格模式会放弃js中的一些不正规的写法,参考 http://www.cnblogs.com/God-Shell/p/3139329.html: 使用声明"use strict&quo ...
- js调试模式控制台输出信息
js调试模式控制台输出信息.console.log
- JS工厂模式开发实践
JS工厂模式开发实践 基于JS工厂模式的H5应用,实现了轮播图功能与滑屏功能,并且实现了文字大小的自适应功能,基于SASS样式开发. 核心的JS代码如下: index.js define(functi ...
- js组合模式
组合模式(Composite),将对象组合成树形结构以表示‘部分-整体’的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 透明方式,也就是说在Commponent中声明所有用来管理子 ...
- JS命令模式个人理解
JS命令模式个人理解 //BODY部分<body> <button id="execute">打开电视</button> <button ...
- 鸿蒙的js开发部模式16:鸿蒙布局Grid网格布局的应用一
鸿蒙入门指南,小白速来!从萌新到高手,怎样快速掌握鸿蒙开发?[课程入口]目录:1.Grid简介2.使用Grid布局实现的效果3.grid-row-gap和grid-colunm-gap属性4.< ...
随机推荐
- 设计模式之Interpreter(解释器)(转)
Interpreter定义: 定义语言的文法 ,并且建立一个解释器来解释该语言中的句子. Interpreter似乎使用面不是很广,它描述了一个语言解释器是如何构成的,在实际应用中,我们可能很少去构造 ...
- Hadoop常用命令总结
一.前述 分享一篇hadoop的常用命令的总结,将常用的Hadoop命令总结如下. 二.具体 1.启动hadoop所有进程start-all.sh等价于start-dfs.sh + start-yar ...
- API网关性能比较:NGINX vs. ZUUL vs. Spring Cloud Gateway vs. Linkerd(转)
前几天拜读了 OpsGenie 公司(一家致力于 Dev & Ops 的公司)的资深工程师 Turgay Çelik 博士写的一篇文章(链接在文末),文中介绍了他们最初也是采用 Nginx 作 ...
- Vue 基础精讲
Vue 基础精讲 Vue 官方文档:https://cn.vuejs.org/v2/guide/ VUE 实例 每个组件都是一个 vue 的实例. 一个 vue 项目是由实例组成的. vue 实例上有 ...
- Nginx:论高并发,在座各位都是渣渣
NGINX 在网络应用中表现超群,在于其独特的设计.许多网络或应用服务器大都是基于线程或者进程的简单框架,NGINX突出的地方就在于其成熟的事件驱动框架,它能应对现代硬件上成千上万的并发连接. NGI ...
- 使用Excel批量给数据添加单引号和逗号
表格制作过程如下: A2表格暂时为空,模板建立完成以后,用来放置原始数据: 在B2表格内输入公式: ="'"&A2&"'"&" ...
- sed/awk advance
$ echo test.file [Group1]cacheways = 19 [Group2]cacheways = 19 $ ls test.sh FILE=test.file2 # Set Gr ...
- oracle审计例子
1.数据库开启审计alter system set audit_trail=db,extended scope=spfile;shutdown immediatestartup 2.对某个表进行审计c ...
- opencv学习之路(16)、膨胀腐蚀应用之走迷宫
一.分析 贴出应用图片以供直观了解 红色部分,因图而异(某些参数,根据图片的不同需要进行相应的修改) 二.代码 #include "opencv2/opencv.hpp" #inc ...
- linux 中部署 rsync 实现文件远程备份及 同步
客户端:数据源:服务端:数据接收方 rsync官方文档:https://www.samba.org/ftp/rsync/rsync.html 手动测试用“通过远程外壳访问"里的语法: 参考1 ...