<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國際加速解決方案。 廣告
                # 作用域鏈 當查找變量的時候,會先從當前上下文的變量對象中查找,如果沒有找到,就會從父級(詞法層面上的父級)執行上下文的變量對象中查找,一直找到全局上下文的變量對象,也就是全局對象。這樣由多個執行上下文的變量對象構成的鏈表就叫做作用域鏈。 **函數的作用域在函數定義的時候就決定了。** 原因: 這是因為函數有一個內部屬性 [[scope]],當函數創建的時候,就會保存所有父變量對象到其中,你可以理解 [[scope]] 就是所有父變量對象的層級鏈,但是注意:[[scope]] 并不代表完整的作用域鏈! 舉例說明: ``` function foo() { function bar() { ... } } ``` 函數創建時,各自的[[scope]]為: ``` foo.[[scope]] = [ globalContext.VO ]; bar.[[scope]] = [ fooContext.AO, globalContext.VO ]; ``` # 函數激活 當函數激活時,進入函數上下文,創建 VO/AO 后,就會將活動對象添加到作用鏈的前端。 這時候執行上下文的作用域鏈,我們命名為 Scope: ``` Scope = [AO].concat([[Scope]]); ``` 至此,作用域鏈創建完畢 以下面的例子為例,結合著之前講的變量對象和執行上下文棧,我們來總結一下函數執行上下文中作用域鏈和變量對象的創建過程: ``` var scope = "global scope"; function checkscope(){ var scope2 = 'local scope'; return scope2; } checkscope(); ``` 1. checkscope 函數被創建,保存作用域鏈到 內部屬性[[scope]] ``` checkscope.[[scope]] = [ globalContext.VO ] ``` 2. 執行 checkscope 函數,創建 checkscope 函數執行上下文,checkscope 函數執行上下文被壓入執行上下文棧 ``` ECStack = [ checkscopeContext, globalContext ] ``` 3. checkscope 函數并不立刻執行,開始做準備工作,第一步:復制函數[[scope]]屬性創建作用域鏈 ``` checkscopeContext = { Scope: checkscope.[[scope]], } ``` 4. 第二步:用 arguments 創建活動對象,隨后初始化活動對象,加入形參、函數聲明、變量聲明 ``` checkscopeContext = { AO: { arguments: { length: 0 }, scope2: undefined } } ``` 5. 第三步:將活動對象壓入 checkscope 作用域鏈頂端 ``` checkscopeContext = { AO: { arguments: { length: 0 }, scope2: undefined }, Scope: [AO, [[Scope]]] } ``` 6. 準備工作做完,開始執行函數,隨著函數的執行,修改 AO 的屬性值 ``` checkscopeContext = { AO: { arguments: { length: 0 }, scope2: 'local scope' }, Scope: [AO, [[Scope]]] } ``` 7. 查找到 scope2 的值,返回后函數執行完畢,函數上下文從執行上下文棧中彈出 ``` ECStack = [ globalContext ]; ```
                  <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>

                              哎呀哎呀视频在线观看