javascript 是单线程语言
javascript 是异步执行的,通过事件循环的方式进行
js引擎执行过程分为三个阶段:
1.语法分析
分析该js脚本代码块的语法是否正确,如果出现不正确,则向外抛出一个语法错误(SyntaxError),停止该js代码块的执行,然后继续查找并加载下一个代码块;如果语法正确,则进入预编译阶段
2.预编译阶段
3.执行阶段
js运行环境:
(1)全局环境
(2)函数环境
(3)eval环境
运行不同的环境会都创建一个执行上下文,js会以栈的形式来处理对这些执行上下文进行处理,形成函数调用栈,栈底是永远是全局执行上下文。
函数调用栈:
特点:先进后出、后进先出
创建执行上下文(发生在预编译阶段)
执行上下文可理解为当前的执行环境,与该运行环境相对应。创建执行上下文的过程中,主要做了以下三件事件
1.创建变量对象
过程:
创建arguments对象 :检查上下文环境,建立该对象的属性与属性值,仅在函数环境中进行(非箭头函数)。
检查function函数声明创建属性 :检查当前上下文函数声明,按照代码顺序,将找到的函数提前声明,如果当前上下文的变量对象没有该函数 名属性,则在该变量对象以函数名建立一个属性,属性值则为指向该函数所在内存地址的引用,如果存在,则会被新的引用覆盖。
检查var变量声明创建属性:检查当前上下文的变量,按代码顺序查找,将找到的变量提前声明,如果当前上下文的变量对象没有该变量名属 性,则在该变量对象以变量名建立一个属性,属性值为undefind,如果存在,则忽略该变量声明。
注:在全局环境中,window对象就是全局执行上下文的变量对象,所有的变量和函数都是window对象的属性方法。
注:创建变量对象发生在预编译阶段,但尚未进入执行阶段,该变量对象都是不能访问的,因为此时的变量对象中的变量属性尚未赋值,值仍为undefined,只有进入执行阶段,变量对象中的变量属性进行赋值后,变量对象(Variable Object)转为活动对象(Active Object)后,才能进行访问
2.建立作用域链
作用域链由当前执行环境的变量对象(未进入执行阶段前)与上层环境的一系列活动对象组成,它保证了当前执行环境对符合访问权限的变量和函数的有序访问。
作用域第一项永远为当前作用域
最后一项永远为全局作用域
作用域链保证了变量和函数的有序访问,查找方式是沿着作用域链从左至右查找变量或函数,找到则会停止查找,找不到则一直查找到全局作用域,再找不到则会抛出引用错误。
3.确定this指向
在全局环境下,全局执行上下文中变量对象的this属性指向为window;函数环境下的this指向却较为灵活,需根据执行环境和执行方法确定