执行环境(环境)

执行环境的用处

执行环境定义了变量或函数有权访问的其他数据每一个执行环境都存在一个关联的变量对象(VO),代码无法访问,内部解析器会使用它,如果环境为函数,则将函数的AO作为VO,函数执行时,会创建一个以当前函数VO为前端的作用域链,以保证执行环境有权访问的所有变量和函数的有序访问。

顶级AO对象 全局

全局对象(Global object) 是在进入任何执行上下文之前就已经创建了的对象;这个对象只存在一份,它的属性在程序中任何地方都可以访问,全局对象的生命周期终止于程序退出那一刻。

全局对象初始化

全局对象初始创建阶段将Math、String、Date、parseInt作为自身属性,等属性初始化,同样也可以有额外创建的其它对象作为属性(其可以指向到全局对象自身)。例如,在DOM中,全局对象的window属性就可以引用全局对象自身(当然,并不是所有的具体实现都是这样)

global = {
Math: <...>,
String: <...>
...
...
window: global //引用自身
};

证据

Chrome

打印global对象时,显示了Window类型对象,里面有一个属性叫window就是global本身

可以看到global和global.window是指向同一对象

全局对象访问
// 相当于 global.String(10)
String(10);
// 相当于 global.window.a = 10 === global.a = 10
window.a = 10;
// 相当于 // global.b = 20;
this.b = 20;

函数的VO对象AO

函数AO对象生成过程

函数执行前

1.分析参数

1.1 函数接收参数,添加到AO的属性上面,值被初始化为undefined

1.2 接收实参,形成AO对应的属性值

2.分析变量声明,如 var a,

2.1:如果AO上还没有a属性键名,则添加a属性键名并且初始化为undefined

2.2:如果AO 上面已经有了a属性,则不做任何操作

3.分析函数的声明,如果 funcion a(){},

3.1:无论是否该函数名存在,都会覆盖当前函数名对应的属性

函数执行时

4.对已经存在的变量声明进行赋值操作

实例

function test(a, b) {
var c = 10;
function d() {}
var e = function _e() {};
(function x() {});
} test(10); // call

1.分析参数

1.1 函数接收参数,添加到AO的属性上面,值被初始化为undefined

AO(test) = {
a: undefined,
b: undefined
}

1.2 接收实参,形成AO对应的属性值

AO(test) = {
a: 10,
b: undefined
}

2.分析变量声明,如 var a,

2.1:如果AO上还没有a属性键名,则添加a属性键名并且初始化为undefined

AO(test) = {
a: 10,
b: undefined,
c: undefined,
e: undefined
}

2.2:如果AO 上面已经有了a属性,则不做任何操作

3.分析函数的声明,如果 funcion a(){},

3.1:无论是否该函数名存在,都会覆盖当前函数名对应的属性

AO(test) = {
a: 10,
b: undefined,
c: undefined,
d: <reference to FunctionDeclaration "d">,
e: undefined
}

函数执行时

4.对已经存在的变量声明进行赋值操作

AO(test) = {
a: 10,
b: undefined,
c: 10,
d: <reference to FunctionDeclaration "d">,
e: <reference to FunctionExpression "_e">
}

js中VO解析的更多相关文章

  1. mvc的自带json序列化的datetime在js中的解析

    默认仅序列化后的日期格式是这样的:'/Date(124565787989)/'(数字随便敲的,数字表示相对于1970年的总毫秒数) 在js中借助eval函数,eval函数的意义:将参数中的字符串当作j ...

  2. js中读取解析json数据

    在数据传输流程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键. JSON字符串:       'var str1 = ' ...

  3. js中bind解析

    一.arguments的含义 // arguments 是一个对应于传递给函数的参数的类数组对象 function a(){ console.log(arguments); } a(); // Arg ...

  4. js中递归解析xml

    xml结构: <RightMenuItems>  <Item Code="New" Name="新建" GroupCode="Edi ...

  5. 浅解析js中的对象

    浅解析js中的对象 原文网址:http://www.cnblogs.com/foodoir/p/5971686.html,转载请注明出处. 前面的话: 说到对象,我首先想到的是每到过年过节见长辈的时候 ...

  6. JS中parseInt()、Numer()深度解析

    JS中字符串转换为数字有两种方式: 1.parseInt函数 定义:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/ ...

  7. js中eval详解,用Js的eval解析JSON中的注意点

    先来说eval的用法,内容比较简单,熟悉的可以跳过eval函数接收一个参数s,如果s不是字符串,则直接返回s.否则执行s语句.如果s语句执行结果是一个值,则返回此值,否则返回undefined. 需要 ...

  8. 用Js的eval解析JSON中的注意点

    在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 使用eval函数来解析,并且使用jquery的ea ...

  9. [JavaScript] JS中对Base64的解析

    JS中对Base64的解析 <script type="text/javascript"> /** * UTF16和UTF8转换对照表 * U+00000000 – U ...

随机推荐

  1. MySQL如果频繁的修改一个表的数据,那么这么表会被锁死。造成假死现象。

    MySQL如果频繁的修改一个表的数据,那么这么表会被锁死.造成假死现象. 比如用Navicat等连接工具操作,Navicat会直接未响应,只能强制关闭软件,但是重启后依然无效. 解决办法: 首先执行: ...

  2. mybatis的参数传递

    mybatis的参数传递分为两种:1.单参数传递  2.多参数传递 单参数 mybatis会直接取出参数值给Mapper文件赋值 例子如下: 1.Mapper文件内容如下: public void d ...

  3. 初探云原生应用管理之:聊聊 Tekton 项目

    [编者的话]“人间四月芳菲尽,山寺桃花始盛开.” 越来越多专门给 Kubernetes 做应用发布的工具开始缤纷呈现,帮助大家管理和发布不断增多的 Kubernetes 应用.在做技术选型的时候,我们 ...

  4. java的Class<T>与类型信息

    类型是一个数据符号,代表着数据的内存布局和访问规则. default public <T> T xxxxx(Class<T> xclass) throws Exception ...

  5. Could not find resource——mybatis 找不到映射器xml文件

    今天用IDEA写Mybatis的时候,测试报了如图所示的错,恶心死我了,后来解决了,总结一下,防止下回跳坑,当然,也是做一个分享,如果有朋友遇到这个错,希望有所帮助 Error parsing SQL ...

  6. WPF-如何添加用户控件(同一个程序集与非同一个程序集)

    在WPF中,假如十个按钮与十个文本框需要在窗体中多次使用,每次都都要重新添加这二十个按钮,显然是不可取的.这时,可以把这二十个按钮封装成一个UserControl,然后多次引用. 一.新建一个用户控件 ...

  7. windows 下安装MongoDB

    一:下载mongodb安装包 下载地址:https://www.mongodb.com/download-center/community 这里推荐下载msi的安装包 二:安装mongodb 双击下载 ...

  8. 安装配置ZooKeeper及基本用法

    要想学习分布式应用,ZooKeeper是一个绕不过去的基础系统.它为大型分布式计算提供开源的分布式配置服务.同步服务和命名注册. 今天先介绍系统的安装和基本使用,后续会推一些基本的Java使用代码. ...

  9. AD的故事继续在Sharepoint里续演

    本以为AD的开发深入工作,可能暂时先放放了,这不最近又一次接触了SP的知识领域,又一次见到了久违相识的老朋友AD域控了,让我没有想到其实服务器这块儿微软的份额这么大...不得不深思微软的核心业务是啥, ...

  10. RV64I基础整数指令集

    RV64I是RV32I的超集,RV32I是RV64I的子集.RV64I包括RV32I的所有40条指令,另外增加了12条RV32I中没有的指令,还有三条移位指令(slli, srli,srai)也进行小 ...