Javascript基础系列(三)-执行环境

数据类型、运行三部曲

基本类型和引用类型的值

弱类型语言, 根据实际执行情况转换变量类型

基本数据类型: 简单的数据段
null, undefined, number, string, boolean

引用数据类型: 可能由多个值构成的对象
object

内置的封装对象
Array, Math, RegExp, Date...

函数参数传递

形参 引用数据类型,值修改*会*影响实参
形参 基本数据类型,值修改*不会*影响实参

类型检测

基本数据类型 typeof  
引用数据类型 instanceof

执行环境及作用域

执行环境 EC (excution context)
决定了变量和函数有权访问的其他数据,决定他们各自的行为,
    每个执行环境都有一个与之关联的变量对象 VO (variable object)。
但编写的代码无法访问这个对象,但解析器在处理数据时会自动在后台使用它

作用域
1.变量访问规则的有效范围及函数的有序访问
2.变量函数定义的时候就确定了作用域链
3.以栈的形式存储作用域链 如 [windows]->[FunctionA]->[functionB]

执行环境
1. 全局 Global Code /局部 Function Code
2. 不存在块级作用域 如下
    
    if( true ) {
    var color = 'red';// 变量作用域并不仅限于if块中, 而是他对应的EC
    }
    alert(color); //依然存在
    

/**
 * AO Activive Object 活动对象
 */
关于AO与VO
它们的作用是帮助js引擎在引用变量的时候能够去顺利找到变量。并且它们之间的联系可以实现作用域链。

1. 每个变量或函数定义的时候会在对应的执行环境下生成与之关联的VO
2. 但函数执行环境的VO对象是无法直接访问的,故每次函数执行时 会根据VO生成一个AO对象
3. windows指向全局执行环境的GO

运行三部曲

语法分析
	检查代码是否有语法错误
	
预编译
	
事件点:发生在函数执行前
动作:
创建AO对象
找形参和变量申明,将变量和形参名作为AO的属性名,值为undefined
实参值与形参统一
在函数体里面找函数申明,值赋值函数体

总结:
函数申明整体提升
变量申明提升

解释执行
读一句执行一句

注意:
	预编译仅变量申明,函数申明,并不会发生赋值,赋值发生在执行阶段
	匿名函数function(){}不参与预编译

小结

数据类型有哪些?以及如何检测数据类型,请自行查阅其他方式检测数据类型
查询相关资料加深对执行环境的理解
深刻理解javascript的运行三部曲
原文地址:https://www.cnblogs.com/pengsn/p/12658067.html