执行上下文
在程序开始运行的时候,代码分为两种:
1.全局代码
2.函数代码(局部代码)
全局执行上下文
在执行全局代码前,将window确定为全局执行上下文
-
var定义的全局变量变为undefined,并添加window属性
-
function声明的全局函数进行赋值,并添加为window方法
-
将this赋值为window
函数执行上下文
在调用函数体之前,要执行函数上下文,创建对应的函数执行上下文对象,就相当于在内存中新开辟一块栈空间用来存储变量。
对局部数据进行预处理
- 形参赋值,并添加为上下文属性
- arguments赋值,并添加为上下文属性
- var定义的局部变量,里面函数的声明和this的赋值都与上面的全局执行上下文相同。
上下文栈
在程序执行的时候,会产生多个上下文对象,所以需要用上下文栈管理起来。
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)
step1:var a = 10
上下文栈 |
---|
全局上下文环境 |
step2:bar(10)
上下文栈 |
---|
bar函数上下文环境 |
全局上下文环境 |
step3:foo(x+b)
上下文栈 |
---|
foo函数上下文环境 |
bar函数上下文环境 |
全局上下文环境 |
step4:依次出栈
测试题
1
console.log(i)
var i = 1
foo(1)
function foo(i){
if(i==4){
return
}
console.log("begin"+i)
foo(i+1)
console.log("end"+i)
}
console.log("endless"+i)
undefined
begin1
begin2
begin3
end3
end2
end1
endless4
2
function a(){}
var a
console.log(typeof a)
function
先执行变量提升,再执行函数提升
3
if(!(b in window)){
var b = 1;
}
console.log(b)
4
var c = 1
function c(c){
console.log(c)
}
c(2)
报错