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执行环境(执行期上下文)详解的更多相关文章

  1. javascript中的this作用域详解

    javascript中的this作用域详解 Javascript中this的指向一直是困扰我很久的问题,在使用中出错的机率也非常大.在面向对象语言中,它代表了当前对象的一个引用,而在js中却经常让我觉 ...

  2. JavaScript对象的property属性详解

    JavaScript对象的property属性详解:https://www.jb51.net/article/48594.htm JS原型与原型链终极详解_proto_.prototype及const ...

  3. VirtualBox开发环境的搭建详解(转)

    VirtualBox开发环境的搭建详解   有关VirtualBox的介绍请参考:VirtualBox_百度百科 由于VirtualBox官网提供的搭建方法不够详细,而且本人在它指导下,从下载所需的开 ...

  4. Javascript 调试利器 Firebug使用详解

    Javascript 调试利器 Firebug使用详解 有时候,为了更清楚方便的查看输出信息,我们可能需要将一些调试信息进行分组输出,那么可以使用console.group来对信息进行分组,在组信息输 ...

  5. Linux环境fork()函数详解

    Linux环境fork()函数详解 引言 先来看一段代码吧, 1 #include <sys/types.h> 2 #include <unistd.h> 3 #include ...

  6. JavaScript中return的用法详解

    JavaScript中return的用法详解 最近,跟身边学前端的朋友了解,有很多人对函数中的this的用法和指向问题比较模糊,这里写一篇博客跟大家一起探讨一下this的用法和指向性问题. 1定义 t ...

  7. fabric网络环境启动过程详解

    这篇文章对fabric的网络环境启动过程进行讲解,也就是我们上节讲到的启动测试fabric网络环境时运行network_setup.sh这个文件的执行流程 fabric网络环境启动过程详解 上一节我们 ...

  8. “全栈2019”Java多线程第八章:放弃执行权yield()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  9. javascript 中合并排序算法 详解

    javascript 中合并排序算法 详解 我会通过程序的执行过程来给大家合并排序是如何排序的...  合并排序代码如下: <script type="text/javascript& ...

随机推荐

  1. KnockoutJS 3.X API 第七章 其他技术(7) 微任务

    注意:本文档适用于Knockout 3.4.0及更高版本. Knockout的微任务队列 Knockout的微任务队列支持调度任务尽可能快地运行,同时仍然是异步的,努力安排它们在发生I / O,回流或 ...

  2. C#设计模式系列:简单工厂模式(Simple Factory)

    1. 简单工厂模式简介 1.1 定义 简单工厂模式定义一个Factory类,可以根据参数的不同返回不同类的实例,被创建的实例通常有共同的父类. 简单工厂模式只需要一个Factory类. 简单工厂模式又 ...

  3. 自用迷你版的Deferred

    啥也不说贴代码,项目用 /** * 迷你版的deferred */ function Deferred(func) { if (this instanceof Deferred === false) ...

  4. JavaScript 命名空间

    <script type="text/javascript"> Namespace=new Object(); Namespace.register=function( ...

  5. 简单测试nginx1.90做TCP协议负载均衡的功能

    最近工作中需要做TCP层面的负载均衡,以前网站用的反向代理nginx只支持应用层的负载均衡,对于TCP协议是无能为力的,需要使用LVS(linux虚拟服务器). LVS的特点是高性能和极复杂的配置.对 ...

  6. Deadlock Detecting--转

    /* Java Threads, 3rd Edition By Scott Oaks, Henry Wong 3rd Edition September 2004 ISBN: 0-596-00782- ...

  7. Stackoverflow/dapper的Dapper-Extensions用法(二)

    之前翻译了Dapper-Extensions项目首页的readme.md,大家应该对这个类库的使用有一些了解了吧,接下来是wiki的文档翻译,主要提到了AutoClassMapper.KeyTypes ...

  8. ORA-01439: 要更改数据类型, 则要修改的列必须为空

    此方法有3处update操作,建议根据实际情况的数据量测试评估效率后选用. 思路:定义要更新数据类型的列为[col_old],数据类型为[datatype_old],临时列为[col_temp],数据 ...

  9. Handler类、异步线程和Message类的参数传递

    声明HandlerThread对象,实现了使用Looper来处理消息队列的功能 //这个类由Android操作系统提供 HandlerThread handlerThread = new Handle ...

  10. MongoDB性能优化

    一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样.其实可以这样说说,索引 ...