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& ...
随机推荐
- iOS—Xcode 7真机测试
Xcode 7真机测试详解 1.准备 注意:一定要让你的真机设备的系统版本和app的系统版本想对应,如果不对应就会出现一个很常见的问题:could not find developer disk im ...
- bootstrap与Select2使用小结
这个select2组件的功能确实很强大,可以将图片放入到select里面随着文字一起显示. 组件的下载地址以及API说明地址: 1.Select2使用示例地址:https://select2.gith ...
- javascript面向对象系列第四篇——选项卡的实现
前面的话 面向对象的应用并非只是读几本书那么容易,需要有大量的工程实践做基础才能真正理解并学会使用它.本文将用面向对象的技术来制作一个简单的选项卡 图示说明 由图示结果看到,这是一个非常简单的选项卡. ...
- ASP.NET Core的配置(1):读取配置信息
提到"配置"二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化 ...
- Routing 功能概述 - 每天5分钟玩转 OpenStack(98)
路由服务(Routing)提供跨 subnet 互联互通功能. 例如前面我们搭建了实验环境: cirros-vm1 172.16.100.3 vlan100 cirros-vm ...
- 部署Icinga-php4
关于Icinga-php4的文档信息及下载地址,可参考:http://icinga-cn.sourceforge.net/ 我这里使用的是icinga-pnp4-cn-1.12.2.tar.xz. 因 ...
- ASP.NET 5 单元测试中使用依赖注入
相关博文:<ASP.NET 5 使用 TestServer 进行单元测试> 在上一篇博文中,主要说的是,使用 TestServer 对 ASP.NET 5 WebApi 进行单元测试,依赖 ...
- geotrellis使用(七)记录一次惨痛的bug调试经历以及求DEM坡度实践
眼看就要端午节了,屌丝还在写代码,话说过节也不给轻松,折腾了一天终于解决了一个BUG,并完成了老板安排的求DEM坡度的任务,那么就分两段来表. 一.BUG调试 首先记录一天的BUG调试,简单copy了 ...
- Java 理论与实践: 正确使用 Volatile 变量--转
原文地址:http://www.ibm.com/developerworks/cn/java/j-jtp06197.html Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 ...
- PHP类的原理
一.类的实现 类的内部存储结构: struct _zend_class_entry { char type; // 类型:ZEND_INTERNAL_CLASS / ZEND_USER_CLASS c ...