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:[] //实参
}
}

一个方法的执行过程:

  1. 创建活动对象,从语法分析树复制方法的内部变量集(variables)和内嵌函数集(functions)
  2. 方法开始执行时: 活动对象- 内部的变量全部被重置为undefined 。
  3. 创建形参(parameters)和实参(arguments)对象,同名的实参,形参和变量之间是【引用】关系
  4. 执行方法内的赋值语句 : 内部的变量才会被赋值 。
  5. 变量查找规则: 现在当前的ActiveObject查找,找不到 则顺着 scopeChain 指向的活动对象 继续,直到找到最顶点 ActiveObject.window
  6. 方法执行完毕以后:内部变量不会被重置
  7. 方法内变量的生存周期取决于方法实例是否存在活动引用,如没有就销毁活动对象

6.7 是使闭包能够访问到外部变量的根本原因

js执行环境相关的更多相关文章

  1. 在ASP.NET Core应用中如何设置和获取与执行环境相关的信息?

    HostingEnvironment是承载应用当前执行环境的描述,它是对所有实现了IHostingEnvironment接口的所有类型以及对应对象的统称.如下面的代码片段所示,一个HostingEnv ...

  2. js执行环境、作用域

    js执行环境.作用域 执行环境:是javascript中的一个重要的概念,<javascript高级程序设计第三版>的定义是:执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行 ...

  3. 【repost】 原生JS执行环境与作用域深入理解

    首先,我们要知道执行环境和作用域是两个完全不同的概念. 函数的每次调用都有与之紧密相关的作用域和执行环境.从根本上来说,作用域是基于函数的,而执行环境是基于对象的(例如:全局执行环境即window对象 ...

  4. JS 执行环境与作用域链

    1.执行环境 JavaScript 代码都是在执行环境中被执行的.执行环境是一个概念,一种机制,用来完成JavaScript运行时在作用域.生命周期等方面的处理,它定义了变量或函数是否有权访问其他数据 ...

  5. 浅谈JS执行环境及作用域

     今天刚刚开通博客,也是第一次写博文,略感紧张.作为一个表达能力弱弱的人来说,自己花三分钟理解一个知识点,当别人问起时,也许需要30分钟才只是让别人知道自己在说什么,一点也不夸张,希望在博客上可以练习 ...

  6. js执行环境深入研究

    js 声明函数是创建函数对象的过程,当创建函数对象时,函数对象的[[scope]] =连当前执行环境对象的作用域(栈顶执行环境--当执行函数时,js会将该函数的执行环境对象入栈) 当为全局函数时,如: ...

  7. JS执行环境,作用域链及非块状作用域

    JS中的执行环境,顾名思义就是变量或函数所执行时的环境.在我的理解中,执行环境和作用域相差不大. 每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中.而在函数执行之后 ...

  8. js执行环境的深入理解

    第一个例子中 :之所以每个函数都返回不同的值的原因 有2点 (简写如下文) 就是[SCOPE]内部属性,函数可能拥有相同的父作用域时,多个函数引用同一个[SCOPE]属性,所以return i的值还是 ...

  9. js执行环境的周边概念

    一.熟悉几个名词: 1.执行环境(execution context),也叫执行上下文,每个函数都会有自己的执行环境:当浏览器首次加载脚本时,他将默认进入全局执行环境:如果接下来要调用一个内部函数,则 ...

随机推荐

  1. Junit技巧

    测试套件: @RunWith(Suite.class) @Suite.SuiteClasses({TaskTest1.class, TaskTest2.class, TaskTest3.class}) ...

  2. cad画指定大小矩形

    指定基点后输入(@长度,宽度)回车 举例:如你要画个600*300的矩形 则输入@600,300回车

  3. Cortex-M3学习日志(六) -- ADC实验

    上一次简单的总结了一下DAC方面的知识,好吧,这次再来总结一下ADC方面的东东.ADC即Analog-to-Digital Converter的缩写,指模/数转换器或者模拟/数字转换器.现实世界是由模 ...

  4. 你是否决绝平庸,你有勇气来学C/C++吗,有勇气来检验你是否经得起世界五百强的面试

       如果你来传智播客学习 你的目标就是要积累工作经验 有机会参加世界五百强的面试 秒杀世界五百强的面试 赢得高薪的offer! C/C++课程大纲 C语言3周21天 完全掌握C语言的本质,成为一名合 ...

  5. MFC非模态对话框销毁

    非模态对话框需要重载OnCanel方法, 并调用DestroyWindow, 且不能调用基类的OnCanel重载PostNcDestroy, 需要delete掉this指针 // Overrides  ...

  6. poj2136---输出特殊图形

    #include <stdio.h> #include <stdlib.h> #include<string.h> ]; int find(int pos,int ...

  7. 面向对象程序设计-C++_课时13初始化列表

    构造函数设置成员初值方法有两种:一种是在函数体内赋值,另一种是采用初始化列表的形式. 初始化列表BETTER 函数体内赋值 类名::类名(形参1,形参2,...形参n) { 数据成员1=形参1; 数据 ...

  8. 关于微信的jsapi_ticket的获取方法;

    对于一个从前端转到后端的开发人员来说,这个玩意儿开始的时候是有点郁闷:不过明白原理之后就简单了, 获取jsapi_ticket:必须先获取access_token; 微信开发文档说access_tok ...

  9. iOS动态运行时方法

    在某些时候,程序可能需要根据获取的参数来决定调用的方法. 要实现这样的功能,就需要使用到动态运行时方法了. 首先需要定义好接口,以便调用. 然后就是动态调用定义好的方法. 这里有两种方法, 第一种: ...

  10. openvswitch常用操作

    原理讲解: 当我们创建一个交换机(网桥)之后即(ovs-vsctl add-br brname),此时网络功能不受影响,但是会产生一个虚拟网卡,名字为brname(与网桥名字同名,可以使用 ifcon ...