浏览器的执行过程
浏览器在执行代码的时候,会先使用编译器把代码解析为浏览器可以执行的代码,然后调用js引擎执行代码
注:图中…只为区分代码
ECStack:Execution [ˌeksɪˈkjuːʃn] Context Stack 执行环境栈
EC:Execution Context 执行环境(执行上下文)
GO: global Object 全局对象在浏览器端会把全局对象赋值给window,所以window就是全局对象,node中不是这样
,全局对象存储一些全局共享的数据。
VO:Varibale Object 变量对象(全局执行上下文中变量存储在VO)
AO:Activation Object 活动对象 (函数的叫做AO,理解为VO的一个分支)
Scope:作用域,创建的函数的时候就赋予的
Scope Chain :作用域链
js引擎想要执行代码,
- 一定会创建一个执行栈(ECStack/栈内存,用来执行代码和存储基本数据类型的值)
- 然后是全局代码执行(全局代码执行首先会创建一个全局执行上下文(EC(g)),全局执行上下文里面会有GO(全局对象))和 VO- 变量对象( 当声明变量会存储到VO中),全局声明变量时也会给全局对象GO中(window)增加一个对应的属性,但let声明不会。
- 然后进栈执行(也就是把EC(g)压缩到栈内存中顶部执行)
- 代码执行遇到引用类型开辟堆内存存储(但是遇到函数,开辟的堆内存里面存储的是函数体中的代码字符串和和一些键值对例如:length:…,name:…)
- 当遇到函数执行的时候会形成一个全新的EC(…)执行上下文(每一个函数执行都会形成一个全新的执行上下文),然后把字符串变为代码执行
- js是单线程的,一次只能执行一个,当遇到函数执行,就会把全局执行上下文压缩到栈底,开始新的执行上线文的执行
- 函数执行:1、初始化实参集合(arguments)2、创建形参变量并赋值3、有变量提升话变量提升4、代码执行(非严格模式下arguments和形参变量有映射机制,改为一个另一个也变)
-函数执行完毕并且和全局执行上下文没有关系,出栈(函数销毁),然后全局执行上下文执行(有关系不出栈,压缩到栈底,把全局上线文拿上来执行)
- 全局执行上下文中变量存储在VO(VO:变量对象,存储当前上下文的变量),值存储在栈或者堆中
- 函数执行上下文中变量存储在AO(AO: 活动对象(也是变量对象),存储函数当前下上文的变量)
- 执行上下文就是当前 JavaScript 代码被解析和执行时所在环境的抽象概念, JavaScript 中运行任何的代码都是在执行上下文中运行。
js数据类型可以分为基本数据类型和引用数据类型
- 基本数据类型:number、string、boolean、undefined、null
- 引用数据类型:object、function
一个变量只能关联一个值,修改变量也就是让变量重新指向一个值
- 阿里面试题
let a={
n:1
}
let b=a;
a.x=a={
n:2
}
console.log(a.x)
console.log(b)
a.x=a={n:2}就相当于 a.x={n:2} a={n:2}
注:let 声明的变量是全局变量(也就在全局执行上下文里),但不是全局属性(也就是没放到GO里)
作用域
> 作用域也就是创建函数时当前执行上下文存储变量的地方(VO/AO)
作用域链
变量取值的过程,先在自己执行上下文中的变量对象中找看是否是自己AO中的私有变量,找不到就去上级作用域查找,有则停止,无就继续,一直找到全局作用域。