搜尋
首頁web前端js教程頁面中執行上下文使用詳解

頁面中執行上下文使用詳解

May 25, 2018 am 11:31 AM
情境使用詳解

這次帶給大家頁面中執行上下文使用詳解,頁面中執行上下文的注意事項有哪些,下面就是實戰案例,一起來看一下。

JavaScript 程式碼執行一段可執行程式碼時,會建立對應的上下文(execution context)並將該上下文壓入上下文堆疊(context stack)中。

上下文包含以下3個重要屬性:

name -
##變數物件(VO, variable object) 目前函數定義的變數、函數、參數
作用域鏈(Scope chain) 原始碼定義時形成的作用域鏈
this
#######

上下文是一個抽象概念,為了方便理解我們假設上下文是一個物件並且包含VO、Scope、th​​is這三個屬性:

function foo (c) {
  let a = 1
  let b = function () {}
}
// foo函数的上下文
fooContext = {
        VO: {
            arguments: { // 实参
              c: undefind,
              length: 0
            },
            a: 1, // 变量
            b: reference to function (){} // 函数
        },
        Scope: [VO, globalContext.VO], // 作用域链
        this: undefind // 非严格模式下为 this
    }

所以上下文是函數運行時的環境或者說是依賴資源的集合,它決定了函數在運行時可以取得哪些變數、函數。

執行上下文(EC): 如果函數處於正在執行狀態則函數的上下文稱為執行上下文, 同時如果函數處於非執行狀態則為(普通)上下文。所以執行上下文只是上下文的不同狀態,本質上它們沒有差別。

上下文堆疊

上下文堆疊又稱為執行堆疊(ECS), 瀏覽器中javascript 解析器本身是單線程的,即同一時間只能處理一個上下文及對應的程式碼段,所以javascript 解析引擎使用上下文堆疊來管理上下文。所有的上下文創建後會保存在上下文棧佇列裡。棧底為全域上下文,棧頂為目前正在執行的上下文。

頁面中執行上下文使用詳解

一個上下文就是一個執行單元, javascript 以堆疊的方式管理執行單元。頁面初始化的時候首先會在堆疊底部壓入全域上下文,然後根據規則執行到可執行函數時會將函數的上下文壓入上下文堆疊 中, 被壓入的上下文包含有該函數運行時所需的資源(變數物件、作用域鏈、this),這些資源提供給函數執行時期的表達式使用。

執行上下文可以理解為函數運行時的環境。同時執行上下文也是一個不可見的概念。

javascript 中有3種運行環境:

  • 全域環境:在瀏覽器中是 window, 在node 環境中是 global,當頁面初始化時會將全域上下文壓入上下文堆疊;

  • 函數環境:當函數被呼叫執行時會收集該函數的資源,建立上下文並壓入上下文堆疊;

  • eval環境,棄用

一個運行環境會對應一個上下文。位於堆疊頂部的上下文執行完畢後會自動出棧,依序向下直至所有上下文運行完畢,最後瀏覽器關閉時全域上下文被銷毀。為了好理解來舉栗子:

let i = 0
function foo () {
    i++
    console.log(i, 'foo')
}
function too () {
    i++
    console.log(i, 'too')
    foo()
}
function don () {
    i++
    console.log(i, 'don')
    too()
}
don()
 // 1 "don"
 // 2 "too"
 // 3 "foo"

上面程式碼的邏輯就是先執行don(),然後是too()、foo()。執行到foo()時的上下文堆疊是這樣的:

頁面中執行上下文使用詳解

我們假設上下文堆疊為陣列:ECStack

ECStack = []

javascript 載入完成後首先解析執行的是全域程式碼,所以初始化的時候會向上下文堆疊中push 全域上下文,我們用globalContext來表示。

ECStack = [
    globalContext
]

全域作用域在整個程式碼運行階段會一直存在,直到頁面關閉時 ECStack 會被請空,從而globalContext則被銷毀。

全域上下文建立的時候進行變數提升、產生變數物件等操作,而後會執行目前上下文中的可執行程式碼(函數、表達式)。遇到函數呼叫的時候會向上下文堆疊中push該函數的上下文。

function foo () {
    console.log('foo')
}
function too () {
    console.log('too')
    foo()
}
function don () {
    too()
}
don()

執行邏輯可以理解為:

  1. 執行到don(), 解析don函數內部程式碼

  2. ##產生don函數的上下文(vo、Scope chain、this)

  3. 壓入don 的上下文到ECStack

  4. 執行don 函數體內部的表達式

  5. 執行too()

  6. #執行too()
  7. 產生too 函數的上下文(vo、Scope chain、this)
  8. ##壓入too 的上下文到ECStack

...#javascript 解析器不斷遞歸直到foo 函數執行完... foo 函數上下文被彈出...然後回溯到

globalContext###上下文...等待...當事件的###回呼函數###被啟動後,執行回調函數。 ( 這裡涉及到 javascript 的執行機制和事件循環,請關注後續文章^_^)###

执行逻辑的伪代码如下:

// 伪代码
// don()
ECStack.push(<don> functionContext);
// 在don中调用了too, push too的上下文到上下文栈里
ECStack.push(<fun2> functionContext);
// 在too中调用了foo, push foo的上下文到上下文栈里
ECStack.push(<fun3> functionContext);
// foo执行完毕, 弹出上下文
ECStack.pop();
// too执行完毕, 弹出上下文
ECStack.pop();
// don执行完毕, 弹出上下文
ECStack.pop();
// 非全局上下文执行完毕被弹出后会一直停留在全局上下文里,直至页面关闭</fun3></fun2></don>
需要注意的是,上下文与作用域(scope)是不同的概念。上下文是一个运行时概念,浏览器运行后执行 js 代码,将不同的上下文加入上下文栈中,顶层的上下文对应的代码块执行完后又将该上下文销毁。 而作用域是一个静态概念,根据所在代码片段的位置及词法关系确立的,不管浏览器运行与否,源代码的作用域关系、变量的访问权限依然不变。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

前端测试金字塔使用步骤详解

怎样处理MySQL数据库拒绝访问

以上是頁面中執行上下文使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
C和JavaScript:連接解釋C和JavaScript:連接解釋Apr 23, 2025 am 12:07 AM

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

從網站到應用程序:JavaScript的不同應用從網站到應用程序:JavaScript的不同應用Apr 22, 2025 am 12:02 AM

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python vs. JavaScript:比較用例和應用程序Python vs. JavaScript:比較用例和應用程序Apr 21, 2025 am 12:01 AM

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

C/C在JavaScript口譯員和編譯器中的作用C/C在JavaScript口譯員和編譯器中的作用Apr 20, 2025 am 12:01 AM

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

JavaScript在行動中:現實世界中的示例和項目JavaScript在行動中:現實世界中的示例和項目Apr 19, 2025 am 12:13 AM

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

JavaScript和Web:核心功能和用例JavaScript和Web:核心功能和用例Apr 18, 2025 am 12:19 AM

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

了解JavaScript引擎:實施詳細信息了解JavaScript引擎:實施詳細信息Apr 17, 2025 am 12:05 AM

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python vs. JavaScript:學習曲線和易用性Python vs. JavaScript:學習曲線和易用性Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!