执行上下文通常有三种,全局执行上下文、函数执行上下文、eval 执行上下文浏览器
全局执行上下文只有一个,在客户端里是浏览器本身建立的,就是咱们常常能碰见的 window 对象
全局执行上下文会有大量的方法,属性,也是咱们全局变量和函数定义的载体。函数
在执行全局代码以前,
全局执行上下文会对代码进行预处理:this
* var 定义的变量赋值为 undefined,而且被 window 收录为属性 * 全局声明的 function 函数,被 window 收录为方法
作完这些之后开始执行全局代码spa
函数执行上下文会出现比较多,具体何时出现呢?
函数执行上下文在准备调用函数,执行函数体的内容以前被建立code
这时函数执行上下文也会对局部数据处理对象
* 形参变量被赋值,被函数执行上下文收录为属性 * arguments 赋值实参列表,被函数上下文收录为属性 * var 声明的变量,被赋值 undefined,被函数上下文收录为属性 * function 声明的函数赋值,被收录为方法 * this 赋值为调用函数的对象
作完以上内容,就开始执行函数内局部代码blog
可是这么多的执行上下文,放在哪里呢?通常语言都讲究容器,像栈内存,堆内存都是为了存放数据而生,因此执行上下文都存放在执行栈里内存
它是用来存储代码执行以前建立的各类栈,有先进后出的特性rem
在代码首次运行的时候,浏览器会建立一个全局执行上下文栈,放到调用栈中(即压栈),而后当每次碰见调用函数的时候,建立的函数执行上下文栈依次压栈,执行完一个函数就会出栈一个上下文,直到最后仍是有个全局上下文栈在最低部it
咱们来看看下面代码的打印顺序
function fun1() { fun2(); console.log('fun1'); }; function fun2() { fun3(); console.log('fun2'); }; function fun3() { console.log('fun3'); }; fun1(); // fun3 fun2 fun1
结果中咱们能看到:fun三、fun二、fun1
这就是咱们所说的,遇到函数调用就建立函数上下文压栈,而且栈中内容先进后出,fun一、fun二、fun3 顺次压栈,出栈顺序就会反过来。
总结