當調用一個函數時,一個新的執行上下文就會被創建,執行上下文的生命周期為兩個部分,一個是創建部分:創建變量對象,確定它的作用域鏈,確定它的this的指向。二個是執行部分,確定變量對象的值。然后將函數引用,執行其他代碼。
變量對象的創建過程:
1,建立一個argunments對象,尋找當前上下文中的參數,并以其參數名以及參數值創建一個屬性。
2,尋找當前上下文當中的function聲明,在變量對象中,以函數名為屬性名,創建以個屬性,值為函數的引用地址,如果函數名重復的話,后面的覆蓋前面的
3,尋找當前上下文當中的var聲明,在變量對象中,以變量名為其屬性名,創建以個屬性,值為undefined
例子
function ?test(){
console.log(foo);
console.log(bar);
var ? foo ='Hello';
console.log(foo);
var ?bar =function(){
return'world';? ??
}
function ?foo(){
return'hello';? ??
}
}
test();
如上例子創建執行上下文時,AO和VO兩部分的區別
AO{
arguments:沒有參數;
function: foo():值為其引用
var:foo和bar,值為undefined
}
VO{
arguments:空;
function:foo():值為引用
var bar = 其引用;foo = hello,還有一個函數屬性名為它本身
}
此時有一個變量聲明foo為undefined,一個函數聲明foo為它自己,后面的函數聲明覆蓋掉了前面的變量聲明,所以當conlose foo的時候,返回整個foo函數,當第二個console foo的時候,此時已經將值付給了foo所以foo為hello
全局環境中的變量對象
它的變量對象為window,變量之類的都為它的屬性,它的this也指向它自己
除此之外,全局上下文的生命周期,與程序的生命周期一致,只要程序運行不結束,比如關掉瀏覽器窗口,全局上下文就會一直存在。其他所有的上下文環境,都能直接訪問全局上下文的屬性。