作用域和作用域鏈

2022-08-27 22:27:16 字數 2964 閱讀 1653

作用域與作用域鏈

①  作用域屬於乙個函式,乙個函式產生了不一樣的作用域

②  函式名.[[scope]]  函式的隱式屬性

[[scope]] 指的就是作用域,其中儲存了執行期的上下文的集合,而這一集合就是作用域鏈

查詢變數:從作用域鏈的頂端依次向下查詢(在那個函式裡面查詢變數,就上那個函式的作用域鏈的頂端依次向下查詢變數

)2. 函式的執行期上下文

①  當函式執行的前一刻,會建立乙個稱為執行期上下文的內部物件ao

②  乙個執行期上下文定義了乙個函式執行時的環境(也就是函式預編譯建立ao後下面的步驟操作),函式每次執行時對應的執行上下文都是獨一無二的

③  多次呼叫乙個函式會導致建立多個執行上下文,當函式執行完畢,它所產生的執行上下文會被銷毀

3 . 用**和**說明函式執行時的作用域鏈和執行上下文問題

① **

function a(){

function b(){

var b = 234;

var a = 123;

b();

var glob = 100;

a();

② 說明

**執行說明

1. a被定義時,在其自己所處的環境下(全域性環境)建立了乙個執行期上下文(go)將其放在

其作用域鏈的頂端,即0位處

2. a被執行時,會再次建立乙個屬於自己函式體的執行期上下文(ao)並將這個ao放在其作用域

鏈的頂端,即0位處,原先的那個go會被向下推一位,位於作用域鏈的1位處

3. b被定義時,會在其自己所處的環境下建立執行期上下文,此時它處於a的函式體內,因此它會

繼承a原先已經建立好的作用域鏈,即a的ao和在全域性環境下建立的go

4. b被執行時,會建立屬於自己函式體的執行期上下文(ao)並將其放在其作用域鏈的頂端,即0

位處,原先繼承的a的ao和go會以此向下推,位於1位和2位處

5. b被執行完成後,b自己的執行期上下文會被銷毀,從而b函式會回歸到b被定義的時刻

6. a被執行完成後,a自己的執行期上下文會被銷毀,從而a函式會回歸到a被定義的時刻,因為b函式

就位於a函式的函式體內,因此當a自己的執行期上下文被銷毀的那一刻,b函式也會被永久銷毀

7. 下一次開始,以此迴圈

③ **說明

a被定義時

a被執行時

b被定義時

b被執行時

b被執行完成後,會銷毀自己的執行上下文,從而剪斷作用域鏈上連線自己的執行上下文的那根線,回歸至

b被定義時的狀態

a被執行完成後,會銷毀自己的執行上下文,從而剪斷作用域鏈上連線自己的執行上下文的那根線,回歸至

a被定義時的狀態,但是,因為

b函式在

a函式的函式體內,所以

b會被銷毀掉

4.關於作用域與作用域鏈的其他**說明

**一function a(){

function b(){

var b = 234;

a = 0;  //這個a是屬於a函式自己的,位於a函式的ao上

var a = 123;

b();

console.log(a); //0

var glob = 100;

a();

**二function a(){

function b(){

var b = 234;

var a = 0;  //這個a是屬於b函式自己的,是在他的函式體內定義的,位於b函式的ao上

console.log(a); //0

var a = 123;

b();

console.log(a); //123

var glob = 100;

a();

**三function a(){

function b(){

function c(){

c();

b();

a();

**三**說明

a defined   a.[[scope]]   ---->  0:go

a doing     a.[[scope]]   ---->  0:aao

1:go

b defined   b.[[scope]]   ---->  0:aao

1:go

b doing     b.[[scope]]   ---->  0:bao

1:aao

2:go

c defined   c.[[scope]]   ---->  0:bao

1:aao

2:go

c doing     c.[[scope]]   ---->  0:cao

1:bao

2:aao

3:go

作用域和作用域鏈

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

作用域和作用域鏈

var a 10 function f1 x,y f1 console.log b 此時b輸出5,因為b 5為隱式的全域性變數 在函式外面使用var 宣告的變數都是全域性變數,作用範圍是程式執行的地方.全域性作用域 函式除外 函式的形參是區域性變數 在函式內部,不使用var 定義的變數,叫隱式全域性...

作用域和作用域鏈

執行環境定義了變數和函式有權訪問的其他資料,決定了他們各自的行為。每個執行環境都有與之對應的變數物件 variable object 儲存著該環境中定義的所有變數和函式。我們無法通過 來訪問變數物件,但是解析器在處理資料時會在後台使用到它。執行環境有全域性執行環境 也稱全域性環境 和函式執行環境之分...