js原理之執行上下文

我的筆記 不足請指正。
數組

js在執行時數據結構

語法分析函數

在執行以前會通篇掃描 有沒有語法錯誤測試

1.imply global 暗示全局變量,即任何變量,若是變量未經聲明就複製,此變量就爲全局全部。this

2.一切聲明的全局變量,全是window的屬性cdn

函數執行的前一刻:對象

1.建立AO對象blog

2.找形參和變量聲明,將變量和形參名做爲AO屬性名,值爲undefined 作用域

       (函數聲明總體提高,變量聲明提高)開發

3.將實參值和形參統一

4.在函數體裏面找函數聲明,賦予函數體


執行js


瞭解執行上下文要先了解下邊兩點

1.棧

棧是相似於數組的一種數據結構

2.引用對象

若是變量是一個對象,實際上變量中存放的是對象的地址


執行上下文:某個函數或全局代碼的執行環境,該環境中包含執行代碼須要的全部信息

能夠簡單的理解爲:執行上下文是一個對象,對象中包含了執行代碼所須要的信息

當執行一個函數時,須要創建執行上下文,創建以後,才正式開始執行。

call stack(執行上下文棧):組織管理程序運行過程當中的執行上下文。

 

執行上下文的內容

1.VO:variable object , 變量對象,存放的是函數或全局代碼執行過程當中須要用到的局部變量

2.scope:做用域

3.this


VO是一個對象,調用函數或執行全局代碼時建立,建立一個vo,須要通過三步:

1.肯定函數形參的值(包括arguments對象)

在函數中尋找數據是,會先從vo中查找,若是vo中不存在,在使用外層數據

AO :active object 執行棧頂上下文的vo

也有人叫VO叫GO,在這裏是沒有區別的 

GO:Global Object 


建立vo對象 

1.肯定形參值

2.肯定函數中全部的函數字面量聲明

        1.該函數必須是字面量聲明,字面量聲明提取到vo後,能夠認爲該聲明失效

        2.若是當前vo中出現同名屬性直接覆蓋

3.肯定函數中全部的變量聲明(var),將其提取到上下文中,值爲undefined

        1.若是當前vo中出現同名屬性,忽略


下面來作幾道測試題


12行輸出。//張三,張三

user1變量是一個對象,user1存放的是對象的地址

user2=user1  故指向同一個地址

當第10行改變name時 由於user1和user2指向同一個地址

故console.log(user1.name)輸出的是張三

在實際開發中爲了不出現這種狀況一般會對一個對象深拷貝在賦給另外一個變量;

19執行,16輸出1


輸出。abc  ,123

試題3:

console.log(foo)//function

var foo="A";

console.log(foo);   //A

var foo=function(){

      console.log("B")

}

console.log(foo);

foo();

function foo(){

     console.log("C")

};

console.log(foo)

foo()

試題4:

var foo=1

function bar(a){

    var a1=a;

    var a=foo;

    function a(){

        console.log(a)

    }

    a1()

}

bar (3)

bar 裏的函數a又一個vo創建了

vo{

}

bar的上下文

vo{

    a:指向函數a,

    a1:指向函數a,

}

全局上下文

vo{

    bar :指向函數bar;

    foo:1;

}

不一樣的做用域。就會生成不一樣的vo ao

相關文章
相關標籤/搜索