首頁 > web前端 > js教程 > 主體

JavaScript執行上下文的詳細介紹(附程式碼)

不言
發布: 2019-03-15 17:02:18
轉載
2749 人瀏覽過

這篇文章帶給大家的內容是關於JavaScript執行上下文的詳細介紹(附程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

在《深入學習js之-執行上下文堆疊》中說過,當JavaScript程式碼執行一段可執行程式碼(executable code)時,會建立對應的執行上下文(execution context)

對於每一個執行上下文,都有三個重要的屬性:

變數物件(Variable object VO)
作用域鏈(Scope chain)
this

本文我們結合這三個部分的內容,講講執行脈絡的具體處理過程。

思考題

在《深入學習js之-詞法作用域與動態作用域》中,提出這樣一道思考題:

// 思考题一:
var scope = "global scope";
function checkscope(){
  var scope = "local scope";
  function f(){
    return scope;
  }
  return f();
}
checkscope();

// 思考题二:
var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f;
}
checkscope()();
登入後複製

兩段程式碼都會列印local scope,但是還是有些許差異的,本文就詳細的解析執行上下文堆疊執行上下文的具體變化過程。

具體分析

我們分析第一段程式碼:

var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f();
}
checkscope();
登入後複製

執行過程如下:

1、執行全域程式碼,建立全域執行上下文,全域上下文被壓入執行上下文堆疊

ECStack = [
  globalContext
];
登入後複製

2、全域上下文初始化

globalContext = {
  VO: [global],
  Scope: [globalContext.VO],
  this: globalContext.VO
}
登入後複製

2、初始化的同時,checkscope 函數被創建,保存作用域鍊到函數內部的屬性[[scope]]

checkscope.[[scope]] = [
  globalContext.VO
];
登入後複製

3、執行checkScope 函數,建立checkScope 函數執行上下文,checkScope 函數執行上下文被壓入執行上下文堆疊:

ECStack = [
  checkscopeContext,
  globalContext
];
登入後複製

4、checkscope 函數執行上下文初始化:

1.複製函數[[scope]] 屬性建立作用域鏈,
2.用arguments 建立活動對象,
3.初始化活動對象,即加入形參、函數宣告、變數聲明,
4.將活動物件壓入checkscope 作用域鏈頂端,

同時f 函數被創建,保存作用域鏈到f 函數的內部屬性[[scope]]

checkscopeContext = {
  AO: {
      arguments: {
        length: 0
      },
      scope: undefined,
      f: reference to function f(){}
  },
  Scope: [AO, globalContext.VO],
  this: undefined
}
登入後複製

5、執行f函數,建立f 函數執行上下文,f 函數執行上下文被壓入執行上下文堆疊

  ECStack = [
    fContext,
    checkscopeContext,
    globalContext
  ]
登入後複製

6、f 函數執行上下文初始化, 以下跟第4 步相同:

1.複製函數[[scope]] 屬性建立作用域鏈
2.用arguments 建立活動物件
3 .初始化活動對象,即加入形參、函數宣告、變數宣告
4.將活動物件壓入f 作用域鏈頂端
  fContext = {
    AO: {
        arguments: {
            length: 0
        }
    },
    Scope: [AO, checkscopeContext.AO, globalContext.VO],
    this: undefined
  }
登入後複製

7、f 函數執行,沿著作用域鏈尋找scope值,返回scope 值

8、f 函數執行完畢,f 函數上下文從執行上下文堆疊中彈出

ECStack = [
  checkscopeContext,
  globalContext
]
登入後複製

9、checkscope 函數執行完畢,checkscope 執行上下文從執行上下文堆疊中彈出

ECStack = [
  globalContext
]
登入後複製

以上是JavaScript執行上下文的詳細介紹(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:segmentfault.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板