<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                >[success] # 全局對象 1. **全局對象**提供在任何地方都可用的變量和函數。默認情況下,那些內置在語言或環境中的一些屬性和方法放一個單獨的內存中(Date、Array、String、Number、setTimeout、setInterval),例如瀏覽器的`window` 中就包含了內部提供一些方法,還有通過var/function聲明的變量是直接存儲到全局對象中 >[info] ## globalThis 1. **ES2020引入了 globalThis 對象**,它提供了跨環境訪問全局對象的標準方法中提出要提供全局變量,簡單說在瀏覽器中為`window`,在node環境中為`global`,但現在為統一目前已經指定了對應的標準,稱之為**globalThis** 2. 在不同js 環境中總是存在不同全局變量標準,往往在**瀏覽器**中**window**或者 **frames**,在**WebWorkers**中**self**,在**Node** 中**global** 3. 下面代碼在瀏覽器中打印你會得到**true** 4. 使用場景假設我們的環境是一個瀏覽器,我們將在這里使用 window。如果腳本可能在其他環境中運行,最好使用 **globalThis** ~~~ globalThis === window ~~~ * 參考 https://mathiasbynens.be/notes/globalthis https://javascript.info/global-object https://tc39.es/ecma262/multipage/global-object.html#sec-global-object https://github.com/tc39/proposal-global >[success] # Execution Contexts 執行上下文 1. 執行上下文(EC)被定義為執行 JavaScript 代碼的環境。也就是我們代碼都將在一個創建好的一個環境中執行,這個環境具備在特定時間代碼可以訪問的 this、變量、對象和函數的值。這類環境分為三種: 1.1. Global execution context **全局執行上下文**(GEC) 1.2. Functional execution context **函數執行上下文**(FEC) 1.3. Execution context inside **內部執行上下文** eval function 2. >[danger] ##### 全局執行上下文-- GEC 1. **GEC全局執行上下文**當打開頁面時,首次加載一個Js文件或者運行一段Js代碼, 則會在**全局代碼執行之前,先創建一個全局的執行上下文**,并將這個全局執行上下文壓入**執行環境棧**中 ,因此它**位于堆棧的底部** 2. 在這個js運行的生命周期中,【**GEC將只創建一次,只有一個**】,即一個程序中只**能存在一個全局執行上下文**, 只有頁面**關閉**時才會釋放掉。 3. 刷新頁面時,會把之前的上下文全都釋放調,然后創建全新的上下文 4. 創建的全局上下文環境中將創建 4.1. **global object 全局對象(在不同環境中表現不同在瀏覽器中為window在node 中為global,當然在新es2020規范可以用globalThis代替)** 4.2. **創建this**并將其綁定到**全局對象** 4.3. 將變量聲明存儲在內存堆和全局執行上下文中的變量中,初始值為`undefined`,**函數會提前聲明**,這個過程也稱之為變量的**作用域提升** 賦值 * **圖解通過控制臺分析** ~~~ var b = 1 const a = {} function bFun() { console.log(this) // a } bFun() ~~~ ![](https://img.kancloud.cn/33/6f/336fcca20c350a96a1792c0b3aea9f5a_1073x260.png) ![](https://img.kancloud.cn/88/c3/88c338089fb690e5d0932ae301fe8980_1087x275.png) * **通過畫圖圖解過程** ![](https://img.kancloud.cn/60/f3/60f38104497db36bb24d92c4a13e4239_921x634.png) >[danger] ##### 函數的上下文 -- FEC 1. **函數執行上下文FEC**,作用是為每個函數調用創建一個執行上下文。但它不是在聲明函數時創建的,而是在**調用函數**時創建 2. 創建一個新的函數的上下文會被添加到執行**棧的頂部** 3. 這個私有上下文可以保護里面的私有變量和**外界互不干擾** 4. 即使是同一個函數但每一次被調用,都會創建一個**新的私有上下文**。 5. 每當一個函數執行完畢,則這個函數的私有執行上下文也將從**棧中彈出**,等到所有函數都運行完畢,要關閉頁面的時候,全局上下文也將出棧釋放,程序運行結束。 6. 只要當前上下文中的某些內容,被當前上下文以外的東西占用,那么當前上下文是不能被釋放的**閉包** 7. 調用過程,在創建函數上下文過程中,默認情況下,JS 引擎會在本地執行上下文中創建一個 **arguments** 對象和一個**this對象**,函數內部預期的鍵值對參數存儲在 arguments 對象中。它還有一個名為 length 的默認屬性,用于計算該函數有多少個參數。當函數的參數為??空時,參數對象默認為長度:0。根據調用函數的方式,函數執行上下文中的this對象會發生變化。如果使用對象引用來調用它,則 this 的值設置為該對象。否則,此變量的值將設置為**gloab**對象或嚴格模式下為**undefined**。 * **控制臺圖解** ![](https://img.kancloud.cn/b1/7c/b17c9e553f3ceac0ab5d8e042e074b59_883x313.png) * **畫圖圖解** * 靜態圖原因,想表達是,每次執行函數時候都會創建一個新的函數上下文,其實當執行第一次函數時候執行完會被彈出棧,并不會像下圖在棧中壓住兩個函數,當函數從棧中彈出時候,在**堆**中區域函數也不會立刻清楚而是等待js的垃圾回收 ~~~ var b = 1 const a = {} function bFun() { var funB = 2 var msg = '123' console.log(this) } bFun() bFun() ~~~ ![](https://img.kancloud.cn/d9/7a/d97ae334197cd112966e6267f9abedfb_833x597.png) * 動態圖 ![](https://img.kancloud.cn/ef/02/ef023f2af9c66aa78f86ead8f05da906_700x373.gif) >[danger] ##### eval 1. JS 引擎遇到**eval()**函數時,就會構造一個執行上下文并將其推送到調用堆棧中。它評估作為參數傳遞的字符串 >[info] ## 總結 1. 代碼執行所在的執行上下文,或者代碼執行所處的作用域, 在JS代碼執行中, 為了區分全局和函數執行所處的不同的作用域(目的是為了區分每個執行上下文中代碼的獨立性),包括創**建變 量對象、建立作用域鏈、確定 this 的指向等** >[info] ## 參考 https://www.javascripttutorial.net/javascript-execution-context/ https://blog.sessionstack.com/how-javascript-works-the-this-variable-and-the-execution-context-12d8f04a40d3 https://codeburst.io/js-demystified-04-execution-context-97dea52c8ac6
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看