首先,我们知道在js中代码主要分为两大类:
1.全局代码
2.函数代码
依据这两个我们可以将执行上下文分成全局执行上下文和函数执行上下文;
一 全局执行上下文
在我们要执行JS代码的时候,浏览器会将window作为全局执行上下文。
那么它会做什么呢? 它会对全局数据进行预处理,主要进行以下的工作:
1.var 定义的全局变量为undefined,添加为window的属性,也就是说,它会收集起来全局变量中var定义的一些变量。
2.对function声明的全局函数进行赋值,添加为window的方法。
3.this赋值为window
4.开始执行全局代码
注意上面的只是准备工作,在正式执行的时候会进行比变量赋值等操作。
所以,你在全局定义的一些东西,通过window都可以调用
二 函数执行上下文
在调用函数,准备执行函数体之前,创建对应的函数执行上下文对象
它会对局部数据进行预处理:
1.对形参变量进行赋值,添加为执行上下文的属性
2.arguments进行赋值,添加为执行上下文的属性
3.var定义的变量==undefined,添加为执行上下文的属性
4.function声明的全局函数==赋值(fn),添加为执行上下文的属性
5.将this指向调用它的对象
6.开始执行函数体代码
注意:在函数执行上下文的时候,如果函数没有执行的时候,它是不会创建的,只有在函数执行的时候,它才会创建。
它其实并不是真实存在的,可以这样想,它更像是一个虚拟的区域。
同时,函数的执行上下文可以有多个,n个不同的函数执行,就会创建n个不同的函数执行上下文