0%

执行上下文

代码分类

全局代码
函数(局部)代码

全局执行上下文

在执行全局代码前将window确定为全局执行上下文

对全局数据进行预处理

var定义的全局变量==>undefined,添加为window的属性
function声明的全局函数==>赋值(fun),添加为window的方法
this==>赋值(window)

开始执行全局代码

函数执行上下文

在调用函数,准备执行函数体之前,创建对应的函数执行上下文

对局部数据进行预处理

形参变量==>赋值(实参)==>添加为执行上下文的属性
arguments==>赋值(实参列表)==>添加为执行上下文的属性
var定义的局部变量==>undefined,添加为执行上下文的属性
function声明的函数==>赋值(fun)==>添加为执行上下文的方法
this==>赋值(调用函数的对象)

开始执行函数体代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//函数执行上下文    注意:是在调用函数时创建的
function fn(a1){
console.log(a1) // 2
console.log(a2) // undefined
a3() //a3()
console.log(this) //window
console.log(arguments) //伪数组(2,3)

var a2=3
function a3(){
console.log('a3()')
}
}
fn(2,3)

执行上下文栈

在全局代码执行前,js引擎就会创建一个栈来存储管理所有的执行上下文对象
在全局执行上下文(window)创建后,将其添加到栈中(压栈)
在函数执行上下文创建后,将其添加到栈中(压栈)
在当前函数执行完后,将栈顶的对象移除(出栈)
当所有的代码执行完后,栈中只剩下window

1
2
3
4
5
6
7
8
9
10
var a=10
var bar=function(x){
var b=5
foo(x+b)
}
var foo=function(y){
var c=5
console.log(a+c+y)
}
bar(10) //此代码创建了3个执行上下文(在调用函数时创建)
1
2
3
4
5
6
7
8
9
10
11
12
13
console.log('global begin: '+i)     //undefined
var i=1 //输出顺序:fb 1
foo(1) //fb 2
function foo(i){ //fb 3
if(i==4) //fe 3
{ //fe 2
return //fe 1
} //ge 1
console.log('foo() begin: '+i)
foo(i+1)
console.log('foo() end: '+i)
}
console.log('global end: '+i)
用你的钱疯狂砸向我吧~~

欢迎关注我的其它发布渠道