原文参考http://mp.weixin.qq.com/s/LijjPErxcFB4pN_wUo2cnw
调用函数时,会创建一个新的执行上下文
它的生命周期有两个阶段
1创建阶段-创建变量对象,建立作用域链,确定this的指向
2执行阶段-执行代码,完成变量赋值,函数引用及其他代码的执行
变量对象的创建
1.建立arguments对象。检查上下文中的参数,建立属性与属性值
2.检查函数声明,即用function声明的函数。在变量对象中,key为函数名,value为指向该函数所在内存地址引用
3.检查变量声明,在变量对象中设置key为变量名,value为undefined,如果存在跳过,原属性值不变
未进入执行阶段,变量对象中各属性无法访问
在进入执行阶段,各属性可以访问
变量对象和活动对象
都是同一个对象,处于不同生命周期,前者时创建阶段后者是执行阶段
demo1
function test(){
console.log(a)
console.log(foo())
var a = 1
function foo(){
return 2
}
}
test()
代码执行顺序为
function test(){
function foo(){
return 2
}
var a
console.log(a)
console.log(foo())
a=1
}
test()// 调用函数,即将开始创建阶段
demo2
function test(){
console.log(foo)
console.log(bar)
var foo = 'Hello'
console.log(foo)
var bar = function(){
return 'world'
}
function foo(){
return 'hello'
}
}
test()
代码执行顺序
function test(){
// 执行阶段先是函数引用
function foo(){
return 'hello'
}
// 变量声明
var foo // var foo = undefined
var bar
console.log(foo) // 此时foo还是function foo(){return 'hello'},因为上面foo=undefined会跳过
console.log(bar) // undefined
foo='Hello'
console.log(foo) // hello,注意此时console在赋值之后才执行,所以能取到值
bar=function(){
return 'world'
}
}
test()
在全局上下文中变量对象就是window对象,this也是指向window
浏览器不关掉窗口,全局上下文一直存在