弱类型语言, 根据实际执行情况转换变量类型
基本数据类型: 简单的数据段
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