打开一个标签页
每打开一个标签页,就会从内存条中开辟一块栈内存(执行上下文栈=>ECStack), 开辟一块堆内存存储Go对象(用来存储在浏览器环境中属性方法,window指向这个对象) 然后就会有一个全局执行上下文栈压入栈中,在全局执行上下文中有Vo对象,用来存全局的变量
词法解析
先把js代码从上到下检查一遍看是否有语法错误,如果有就报错,如 :let不能声明一个生命过的变量,如果解析时发现语法错误直接报错
变量提升
使用var 和 function声明的变量和方法存在变量提升 var是只声明不赋值 function声明的方法在声明的时候直接赋值,开辟一块堆内存用来存储方法内部的字符串,把地址值存到栈内存的值存储区域,变量指向相应的值 其他声名变量的方式都不会变量提升 VO下的变量也是为window添加属性
代码执行
代码自上而下执行,遇到变量赋值,就要在值存储区,存上值,变量和值关联 遇到function声明的方式越过 遇到方法执行,就要开辟一块新的栈,把他压入ECStack栈的顶部 确定这个栈的上级作用域(也就是这个在的堆内存所属的作用域),确定函数内部this指向,确定arguments,形参赋值,词法解析,变量提升,执行内部的代码,代码执行之后,如果外部作用域没有用到这个作用域的变量,就把它弹栈
关闭标签页
关闭标签页,整个ECStack就销毁