js的执行上下文
js整个的代码执行的过程如下图
在执行阶段创建执行上下文,执行上下文可以理解为当前执行的这段代码的执行环境,执行上下文分为三种:Global Code、Function Code 和 Eval Code。所有的执行上下文都会被放入执行上下文栈中,最先入栈的是全局上下文,栈顶永远是当前的执行上下文,执行完毕就出栈,全局上下文最后出栈,如果函数上下文中遇到return可以直接终结当前代码的执行,将其执行上下文直接弹出栈。
执行上下文的生命周期为
当函数被调用时,就会为其创建执行上下文,三个步骤:生成变量对象、建立作用域链和确定this的指向。
- 生成变量对象
全局上下文中的变量对象就是全局对象,可以用this访问,在浏览器中this指向window,在node中,this指向global。
在函数上下文中变量对象,根据函数声明生成一个指向内存中函数的指针,如果函数名已经存在则覆盖,根据变量声明生成变量,其值为undefined,如果变量名已经存在则忽略此次声明。 - 建立作用域链
在查找一个变量时,从当前的执行上下文开始查找,如果没有就去父级的执行上下文查找,一直找到全局上下文,这样由多个执行上下文构成链表就叫作用域链。js基于词法作用域创建函数作用域,函数的作用域在声明时就已经确定了,而不是函数执行的时候。 - 确定this的指向
在全局上下文中,this指向全局对象(浏览器中就是window)。
在函数中,this的指向取决于函数如何被调用。
参考文章