javascript执行环境(执行期上下文)详解
javascript执行环境(执行期上下文)
当js控制器(control)进入可执行代码时,控制器会进入一个执行环境,活动的多个执行环境构成执行环境栈,最上面的是正在运行的执行环境,当控制器进入一个新的执行环境时,新的执行环境被放到栈最顶端。
执行环境包含以下三个组件: 组件 作用目的
词法环境 执行环境内的代码创建的标识符引用的一个词法环境对象
变量环境 执行环境内的代码通过变量表达式和函数表达式创建的绑定的一个词法环境对象。
this绑定 指定该执行环境内的this关键字所关联的值。 执行环境的建立 当执行全局代码,使用eval函数,执行一个函数时,会创建执行环境。
创建执行环境分两步,第一步初始化执行环境,下面是全局代码和函数的初始化过程:
1,全局代码
ECMA全局执行环境C的初始化过程:
(1)将变量环境设置为全局环境
(2)将词法环境设置为全局环境
(3)将this绑定设置为全局对象 2,进入函数代码
当进入一个函数对象F,调用者提供的thisArg,调用者提供的argumentsList时,执行以下步骤
(1)设置this:
if(函数是严格模式代码){
this=thisArg;
}else if(thisArg===null||thisArg=undefined){
this=全局对象
}else if(Type(thisArg!==Object)){
this=ToObject(thisArg);
}else{
this=thisArg;
}
(2)以F的内部属性[[Scope]]作为参数调用来调用声明式执行环境,结果记为localEnv,
设置词法环境为localEnv,设置变量环境为localEnv
(3)令code为F的内部属性[[Code]] 接下来就是声明绑定初始化过程,此过程比较复杂,主体过程如下:
1,env=当前执行环境的变量环境
2,if(eval代码){
configurableBindings=true;
}else{
configurableBindings=false;
}
3,if(strict mode code){
strict=true;
}else{
strict=false;
}
4,if(函数代码){
func=调用code的内部属性[[Call]]的结果
names=func的形式参数[[FormalParameters]]内部属性
argCount=args的长度
n=0
foreach(argName in names){
n++
v=n>argsCount?undefined:v=args[n]
argAlreadyDeclared=env.HasBinding(argName)
if(argAlreadyDeclared===false){
env.CreateMutableBinding(argName)//变量环境创建可变绑定
}
env.SetMutableBinding(argName,v,strict)//变量环境设置可变绑定
}
}
5,对于code中的每一个函数声明f,按以下步骤进行:
fn=f的Identifier
fo=f的初始化结果
funcAlreadyDeclared=env.HasBinding(fn)
if(funcAlreadyDeclared===false){
env.CreateMutableBinding(fn,configurableBindings)
}else if(env===全局环境记录对象){
go=全局对象
existingProp=以fn为参数调用go的内部属性[[GetProperty]]的结果
if(existingProp的[[Configurable]]内部属性===true){
go.[[DefineOwnProperty]](fn,Property Descriptor {[[Value]]: undefined, [[Writable]]: true, [[Enumerable]]: true , [[Configurable]]: configurableBindings },true)
}else if(existingProp是访问器属性描述符 或 existingProp 没有属性值{[[Writable]]: true, [[Enumerable]]: true}){
Throw a TypeError exception
}
env.SetMutableBinding(fn,fo,strict)
}
6,argumentsAlreadyDeclared=env.HasBinding(arguments)
7,if(code is function code and argumentsAlreadyDeclared===false){
argsObj=CreateArgumentsObject(func, names, args, env , strict)
if(strict===true){
env.CreateImmutableBinding(arguments)
env.InitializeImmutableBinding(arguments,argsObj)//严格模式的arguments不可变
}else{
env.CreateMutableBinding(arguments)
env.SetMutableBinding(arguments,args,false)//非严格模式arguments可变
}
}
8,对于code中的每一个变量声明d:
dn=d的Identifier
varAlreadyDeclared=env.HasBinding(dn)
if(varAlreadyDeclared===false){
env.CreateMutableBinding(dn,configurableBindings)
env.SetMutableBinding(dn,undefined,strict)
}
javascript执行环境(执行期上下文)详解的更多相关文章
- javascript中的this作用域详解
javascript中的this作用域详解 Javascript中this的指向一直是困扰我很久的问题,在使用中出错的机率也非常大.在面向对象语言中,它代表了当前对象的一个引用,而在js中却经常让我觉 ...
- JavaScript对象的property属性详解
JavaScript对象的property属性详解:https://www.jb51.net/article/48594.htm JS原型与原型链终极详解_proto_.prototype及const ...
- VirtualBox开发环境的搭建详解(转)
VirtualBox开发环境的搭建详解 有关VirtualBox的介绍请参考:VirtualBox_百度百科 由于VirtualBox官网提供的搭建方法不够详细,而且本人在它指导下,从下载所需的开 ...
- Javascript 调试利器 Firebug使用详解
Javascript 调试利器 Firebug使用详解 有时候,为了更清楚方便的查看输出信息,我们可能需要将一些调试信息进行分组输出,那么可以使用console.group来对信息进行分组,在组信息输 ...
- Linux环境fork()函数详解
Linux环境fork()函数详解 引言 先来看一段代码吧, 1 #include <sys/types.h> 2 #include <unistd.h> 3 #include ...
- JavaScript中return的用法详解
JavaScript中return的用法详解 最近,跟身边学前端的朋友了解,有很多人对函数中的this的用法和指向问题比较模糊,这里写一篇博客跟大家一起探讨一下this的用法和指向性问题. 1定义 t ...
- fabric网络环境启动过程详解
这篇文章对fabric的网络环境启动过程进行讲解,也就是我们上节讲到的启动测试fabric网络环境时运行network_setup.sh这个文件的执行流程 fabric网络环境启动过程详解 上一节我们 ...
- “全栈2019”Java多线程第八章:放弃执行权yield()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- javascript 中合并排序算法 详解
javascript 中合并排序算法 详解 我会通过程序的执行过程来给大家合并排序是如何排序的... 合并排序代码如下: <script type="text/javascript& ...
随机推荐
- 【Win 10应用开发】实现全屏播放的方法
有人会问,以前的MediaElement控件不是有现成的一排操作按钮吗?而且可以直接进入全屏播放.是的,我们知道,以往的Store App都是在全屏模式下运行的,只要MediaElement控件填满整 ...
- ReceiveQueue
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace NetF ...
- 万能Adapter以及ViewHolder性能优化
//CommonAdapter import android.content.Context; import android.widget.BaseAdapter; import java.util. ...
- Android中activity背景色的设置
Android应用开发——系统自带样式Android:theme •android:theme="@android:style/Theme.Dialog" 将一个Activit ...
- .NET平台开源项目速览(3)小巧轻量级NoSQL文件数据库LiteDB
今天给大家介绍一个不错的小巧轻量级的NoSQL文件数据库LiteDB.本博客在2013年也介绍过2款.NET平台的开源数据库: 1.[原创]开源.NET下的XML数据库介绍及入门 2.[原创]C#开源 ...
- Python学习第一弹——Python环境搭建
一.Python简介: Python,是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年.Python语法简洁而清晰,具有 ...
- UML中的六大关系(转)
UML定义的关系主要有六种:依赖.继承.关联.实现.聚合和组合.这些类间关系的理解和使用是掌握和应用UML的关键,而也就是这几种关系,往往会让初学者迷惑.这里给出这六种主要UML关系的说明和类图描述, ...
- C#解决Linq OrderBy() 失效的小技巧
前言 前几天的一个数据列表中我用了Linq GroupBy 和OrderBy. 排序在本机正常使用,发到测试后排序死活不对,很是郁闷,总以为是程序问题.于是请教了另外一个同事.有了以下的答案. 问题原 ...
- Solr学习总结(六)SolrNet的高级用法(复杂查询,分页,高亮,Facet查询)
上一篇,讲到了SolrNet的基本用法及CURD,这个算是SolrNet 的入门知识介绍吧,昨天写完之后,有朋友评论说,这些感觉都被写烂了.没错,这些基本的用法,在网上百度,资料肯定一大堆,有一些写的 ...
- 基于Hadoop生态技术构建阿里搜索离线系统
一.计算平台架构 平台架构 集群规模 集群特点 二.支撑的搜索业务 搜索业务 处理流程 三.YARN计算平台 iStream计算模型 Schedule改进 AppHistoryServer改进 HSt ...