以下面的例子為例,結合著之前講的變數物件和執行上下文棧,我們來總結一下函式執行上下文中作用域鏈和變數物件的建立過程:
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...
作用域和作用域鏈
全域性作用域 全域性的變數執行環境 函式作用域 函式內部的變數執行環境 每個函式都有自己的執行環境,當執行流進入乙個函式時,函式的環境就會被推入乙個環境棧中。函式執行之後,棧將環境彈出,把控制權返回給之前的執行環境。全域性作用域只要頁面不解除安裝,就一直存在,不釋放。函式每次在呼叫時,都會形成乙個作...