學透作用域鏈

2022-07-10 20:09:11 字數 1182 閱讀 1611

以下面的例子為例,結合著之前講的變數物件和執行上下文棧,我們來總結一下函式執行上下文中作用域鏈和變數物件的建立過程:

var scope = "global scope";

function checkscope()

checkscope();

執行過程如下:

1.checkscope 函式被建立,儲存作用域鏈到 內部屬性[[scope]]

checkscope.[[scope]] = [

globalcontext.vo

];2.執行 checkscope 函式,建立 checkscope 函式執行上下文,checkscope 函式執行上下文被壓入執行上下文棧

ecstack = [

checkscopecontext,

globalcontext

];3.checkscope 函式並不立刻執行,開始做準備工作,第一步:複製函式[[scope]]屬性建立作用域鏈

checkscopecontext =

4.第二步:用 arguments 建立活動物件,隨後初始化活動物件,加入形參、函式宣告、變數宣告

checkscopecontext = ,

scope2: undefined

},scope: checkscope.[[scope]],

}5.第三步:將活動物件壓入 checkscope 作用域鏈頂端

checkscopecontext = ,

scope2: undefined

},scope: [ao, [[scope]]]

}6.準備工作做完,開始執行函式,隨著函式的執行,修改 ao 的屬性值

checkscopecontext = ,

scope2: 'local scope'

},scope: [ao, [[scope]]]

}7.查詢到 scope2 的值,返回後函式執行完畢,函式上下文從執行上下文棧中彈出

ecstack = [

globalcontext

];

作用域 作用域鏈

理解 就是一塊 地盤 乙個 段所在的區域 它是靜態的 相對於上下文物件 在編寫 時就確定了 分類全域性作用域 函式作用域 沒有塊作用域 es6有了 作用隔離變數,不同作用域下同名變數不會有衝突 區別1全域性作用域之外,每個函式都會建立自己的作用域,作用域在函式定義時就已經確定了。而不是在函式呼叫時 ...

從作用域鏈學閉包

閉包 閉包是乙個能訪問外部函式定義的變數的函式。為什麼?當訪問乙個變數時,直譯器會首先在當前作用域查詢標示符,如果沒有找到,就去父作用域找,直到找到該變數的標示符或者不再存在父作用域了,這就是作用域鏈。作用域鏈的頂端是全域性物件。先來看看 var color blue function getcol...

作用域和作用域鏈

全域性作用域 全域性的變數執行環境 函式作用域 函式內部的變數執行環境 每個函式都有自己的執行環境,當執行流進入乙個函式時,函式的環境就會被推入乙個環境棧中。函式執行之後,棧將環境彈出,把控制權返回給之前的執行環境。全域性作用域只要頁面不解除安裝,就一直存在,不釋放。函式每次在呼叫時,都會形成乙個作...