执行上下文:JavaScript代码被解析和执行的地方,只要JavaScript代码运行,它就一定运行在执行上下文中。
执行上下文分类:
一、全局执行上下文:
1、任何不在函数内部都属于全局执行上下文。
2、浏览器会创建一个window对象。且this指向这个对象。
3、一个程序中只有一个全局执行上下文。
二、函数执行上下文:
1、当函数被调用的时候会创建一个函数执行上下文。
2、可以存在多个。
三、Eval函数执行上下文:指得是运行在eval函数中的代码,很少用(了解即可);
执行上下文生命周期:
1、创建阶段:
创建变量对象:初始化函数的参数argument,提升函数声明和变量声明。
创建作用域链:作用域链在变量对象后创建,作用域链包含变量对象,是为了解析变量对象的过程。
确定this指向。
2、执行阶段:
变量赋值,代码执行。
3、回收阶段:
执行上下文出栈(先进后出,后进先出),等待虚拟机回收执行上下文。
执行上下文栈:
1、JavaScript代码执行时,首先创建一个全局执行上下文环境,把它压入执行栈的最底部。
2、每次碰到一个函数,创建一个函数执行上下。压入执行栈中,(全局执行上下文的顶部);
3、引擎会执行位于执行上下文顶部的函数,当函数执行完毕,当前函数执行上下文从执行栈中弹出,继续执行下一个上下文。
4、所有函数执行上下文执行完毕,弹出全局执行上下文。
let a = 'Hello World!';
function first() {
console.log('Inside first function');
second();
console.log('Again inside first function');
}
function second() {
console.log('Inside second function');
}
first();