JavaScript進階教程日記

晨晨mak發表於2023-12-05

1. 預編譯

1.1 全域性物件(GO物件) window

js引擎會整合所有<script>標籤中的內容, 產生window物件


全域性變數: 全域性物件的一個屬性


全域性函式: 全域性物件的一個方法


1.2 區域性物件AO/活動物件AO

函式被呼叫時產生,儲存當前函式內部的執行環境。方法執行完後, 區域性物件就消失


區域性變數: 是區域性物件的一個屬性


區域性函式: 是區域性物件的一個方法


1.3 全域性預編譯

全域性環境下(script標籤下),js引擎的預處理方式


步驟


1. 生成GO物件(window物件)

2. 查詢所有變數的宣告,變數名作GO物件屬性名,值為undefined


3. 查詢所有函式的宣告,函式名作GO物件屬性名,屬性值為function


同名的變數和函式,函式的優先順序高


1.4 函式預編譯

呼叫函式之前會做一個函式的預編譯


步驟


        1. 呼叫那一刻,為函式生成一個AO物件


        2. 查詢函式形參和區域性變數的宣告,作為AO屬性名,值為undefined


        3. 實參值賦給形參


        4. 找到區域性函式的宣告,函式名作AO物件屬性名,屬性值為function


區域性函式 > 實參 > 形參和區域性變數


2. 作用域

2.1 全域性作用域

script標籤產生的區域,window物件管控的區域


全域性的變數和函式瀏覽器關閉的時候銷燬


2.2 區域性作用域 function () { }

函式物件 管控區域


區域性變數和函式 在函式執行完成後銷燬


2.3 塊級作用域 { let a = 1; }

if、for 管控的 {} 區域


let


2.4 作用域鏈

        內部可以訪問外部


        使用陣列存放,棧結構(上端進出,元素壓棧進去,先產生的在下面)


        本質


                是一個資料結構,函式內部可以巢狀函式,每一次巢狀形成一個作用域,串起來就形成作用域鏈


                每個函式內部都的【scopes】屬性,代表函式的作用域鏈,代表函式執行時所存在的執行環境(含每個作用域中的變數、區域性函式)


                console.dir(a); //列印函式內部結構(含scopes屬性)


                分別代表:




                                                        0 bAO

                                                        1 aAO

                                                        2 GO


        斷點除錯




2.5 變數取值原則

就近原則,當前作用域中沒有 就找上一層,依次往上找,都沒有就報錯


3. 原型

例項成員 this新增的成員


靜態成員 在建構函式本身上新增的成員,透過建構函式名訪問




原型物件prototype: 建構函式的一個靜態成員屬性 Star.prototype


物件的原型: 物件的一個屬性 ldh.__proto__


原型物件與物件的原型,指向同一個物件,都有一個屬性constructor(指向建構函式本身)


原型鏈


概念


                例項物件的__proto__屬性,指向的建構函式的原型物件。


(也是一個物件,也有__proto__屬性),再一層一層往上找就形成原型鏈


作用


        1. 當例項物件呼叫方法,先在自身的this中的方法找

        2. 沒有的話,透過__proto_找原型物件,看原型物件裡有無定義

        3. 沒有的話,透過原型物件的__proto__再到上一層

        4. 一直找到object都沒有,則報錯


        __proto__ 物件原型的存在,就是為物件成員的查詢機制提供了一個方向


this指向


        建構函式和原型物件中的this 都指向當前建立的物件


應用(為js陣列Array擴充套件sum方法)


Array.prototype.sum = function(){

  console.log(this); //this代表這個陣列物件

    var total = 0

    for(var i=0; i<this.length; i++){//當前陣列長度

        total += this[i]  //當前陣列某個值

    }

    return total

}


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70001647/viewspace-2998766/,如需轉載,請註明出處,否則將追究法律責任。

相關文章