js执行环境相关
Js执行过程
如果一个文档中存在多个代码段
步骤一:读入第一个代码段(js引擎并非一行一行执行,而是一段一段分析执行)
步骤二:做词法分析和语法分析,有错则报语法错误(比如括号不匹配等),并跳转到步骤5
步骤三:对【var】变量和【function】定义做“预解析“(永远不会报错的,因为只解析正确的声明)
步骤四:执行代码段 ,有错则报错(比如变量未定义)
步骤五:如果还有下一代码段,则读入下一代码段,重复步骤二
步骤六:结束
通过步骤二 js会先生成一个语法分析树(SyntaxTree)
语法分析树可以理解为 记录 变量集 作用域集 方法集的 数据库一样的东西。
/**
* 模拟建立一棵语法分析树,存储function内的变量和方法
*/ var SytaxTree = { window={
variables:{
name:{value:'HEBO'} //假设我们全局变量中有一个name
},
functions:{
sayName:this.sayName
}
},
sayName:{
scope:this.window,
function:{}
}
} //在这一步的时候 变量集中 只有变量定义,没有变量值,这时候的变量值全部为“undefined”
//
词法作用域: 变量在定义的时候形成作用域,而不是在执行的时候。
在进入上下文时声明,在执行上下文赋值
function test(){
var a =0; //定义的时候决定了作用域
}
console.log(a); // a is not defined
执行环境与活动对象
我们调用每一个方法的时候,JS 引擎都会自动为其建立一个执行环境和一个活动对象,它们和方法实例的生命周期保持一致,为方法执行提供必要的执行支持
执行环境ExecutionContext: 记录了当前方法的外部描述信息,比如类型,名称,参数和活动对象(activeObject)
var ExecutionContext = {
window: {
type: "global",
name: "global",
body: ActiveObject.window
},
a:{ //记录了a方法的 一些执行上下文信息
type: "function",
name: "a",
body: ActiveObject.a, //指向当前方法的活动对象
scopeChain: this.window.body //作用域链 它指向的是 对应方法的活动对象 ,既window.body(ActiveObject.window ) 变量查找就是跟着这条链条查找的
}
};
在执行的时候才生成活动对象 ,活动对象的 北部变量集、内嵌函数集是从 语法分析树 复制过来的
活动对象ActiveObject: 记录了当前方法的内部描述信息,内部变量集(variables)、内嵌函数集(functions)、实参(arguments)、作用域链(scopeChain)等执行所需信息
var ActiveObject={
window:{},
a:{ //这里的a 对应上文的 ActiveObject.a
variables:{
x: {value:4}
},
functions:{
b: SyntaxTree.b
},
parameters:{ //形参
},
arguments:[] //实参
}
}
一个方法的执行过程:
- 创建活动对象,从语法分析树复制方法的内部变量集(variables)和内嵌函数集(functions)
- 方法开始执行时: 活动对象- 内部的变量全部被重置为undefined 。
- 创建形参(parameters)和实参(arguments)对象,同名的实参,形参和变量之间是【引用】关系
- 执行方法内的赋值语句 : 内部的变量才会被赋值 。
- 变量查找规则: 现在当前的ActiveObject查找,找不到 则顺着 scopeChain 指向的活动对象 继续,直到找到最顶点 ActiveObject.window
- 方法执行完毕以后:内部变量不会被重置
- 方法内变量的生存周期取决于方法实例是否存在活动引用,如没有就销毁活动对象
6.7 是使闭包能够访问到外部变量的根本原因
js执行环境相关的更多相关文章
- 在ASP.NET Core应用中如何设置和获取与执行环境相关的信息?
HostingEnvironment是承载应用当前执行环境的描述,它是对所有实现了IHostingEnvironment接口的所有类型以及对应对象的统称.如下面的代码片段所示,一个HostingEnv ...
- js执行环境、作用域
js执行环境.作用域 执行环境:是javascript中的一个重要的概念,<javascript高级程序设计第三版>的定义是:执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行 ...
- 【repost】 原生JS执行环境与作用域深入理解
首先,我们要知道执行环境和作用域是两个完全不同的概念. 函数的每次调用都有与之紧密相关的作用域和执行环境.从根本上来说,作用域是基于函数的,而执行环境是基于对象的(例如:全局执行环境即window对象 ...
- JS 执行环境与作用域链
1.执行环境 JavaScript 代码都是在执行环境中被执行的.执行环境是一个概念,一种机制,用来完成JavaScript运行时在作用域.生命周期等方面的处理,它定义了变量或函数是否有权访问其他数据 ...
- 浅谈JS执行环境及作用域
今天刚刚开通博客,也是第一次写博文,略感紧张.作为一个表达能力弱弱的人来说,自己花三分钟理解一个知识点,当别人问起时,也许需要30分钟才只是让别人知道自己在说什么,一点也不夸张,希望在博客上可以练习 ...
- js执行环境深入研究
js 声明函数是创建函数对象的过程,当创建函数对象时,函数对象的[[scope]] =连当前执行环境对象的作用域(栈顶执行环境--当执行函数时,js会将该函数的执行环境对象入栈) 当为全局函数时,如: ...
- JS执行环境,作用域链及非块状作用域
JS中的执行环境,顾名思义就是变量或函数所执行时的环境.在我的理解中,执行环境和作用域相差不大. 每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中.而在函数执行之后 ...
- js执行环境的深入理解
第一个例子中 :之所以每个函数都返回不同的值的原因 有2点 (简写如下文) 就是[SCOPE]内部属性,函数可能拥有相同的父作用域时,多个函数引用同一个[SCOPE]属性,所以return i的值还是 ...
- js执行环境的周边概念
一.熟悉几个名词: 1.执行环境(execution context),也叫执行上下文,每个函数都会有自己的执行环境:当浏览器首次加载脚本时,他将默认进入全局执行环境:如果接下来要调用一个内部函数,则 ...
随机推荐
- CentOS和Redhat发行版linux内核版本的对应关系
由于Redhat和CentOS的发行版本现在众多,所以我们应该知道CentOS和Redhat及linux内核之间版本的对应关系对维护系统还是很有帮助的.对应的列表如下: Redhat 9.0————— ...
- Kill 正在执行的存储过程
1.找到正在执行的存储过程的 sid ,serial# select b.sid,b.SERIAL#,a.OBJECT, 'alter system kill session ' || ''' ...
- 一个基于MINA框架应用的最简单例子
直接上代码.关于原理和主要的API以后在说.先能跑通了在说. 主要的包:mina-core-2.0.0.jar[到官网上下载完整项目包里面还有文档和依赖包],jcl-over-slf4j-1.5.11 ...
- Exec sql/c
Exec sql/c 利用高级语言的过程性结构来弥补SQL语言实现复杂应用方面的不足. 嵌入SQL的高级语言称为主语言或宿主语言. 在混合编程中,SQL语句负责操作数据库,高级语言语句负责控制程序流程 ...
- Billboard(线段树)
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- LeetCode总结 -- 高精度篇
我们常见的一些主要的数据结构比方整型int或者浮点型float由于位数过多无法用内置类型存储,这时候我们就须要自己实现高精度的数据类型来进行存储和运算.这样的问题在实际产品中还是比較有用的,所以相对来 ...
- 简单的Cookie登录
登录页前台代码 <form id="form1" action ="" method="post"> <input typ ...
- STMP发送邮件被当垃圾邮件处理的解决方法
昨天使用了.Net通过smtp发送邮件的方式发送了一封邮件到自己的QQ邮箱,但是发送成功后并没有提示邮箱收到新的邮件,而且去收件箱里面也没有新增的邮件. 这让本人觉得奇怪,所以就觉得是否被当作垃圾邮件 ...
- 微信开发-Jssdk调用分享实例
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.IO ...
- 开源libusb驱动的libwdi驱动安装API库和zadig.exe安装UI应用程序的编译和调试
一.目的 二.编译环境 系统:Win7 ~ Win10 编译工具:Visual Studio 2008 或 Visual Studio 2010 或Visual Studio 2015 libwdi编 ...