瞭解 JavaScript 中的執行上下文
瞭解 JavaScript 的核心概念可以讓開發人員達到一個全新的水平,JavaScript 最重要的概念之一是執行上下文,它無處不在——每次你開始使用 JavaScript 創建東西時,無論你是否知道,你都會在後臺使用它。每次新應用程序啓動時,每次執行函數時,執行上下文都會在那裡。那麼,什麼是執行上下文?
執行上下文允許 JavaScript 引擎管理解釋和運行代碼的複雜性。執行上下文是一個抽象概念,它包含有關當前代碼正在執行的環境的信息。
我們有三種不同類型的JavaScript 執行上下文:
全局執行上下文——這個執行上下文由 JavaScript 引擎默認創建。
函數執行上下文 - 每當執行函數時都會創建此執行上下文。
eval 執行上下文——這個執行上下文是在一個 eval 函數中創建的。
1. 全局執行上下文
第一個執行上下文是在 JavaScript 引擎運行您的代碼時創建的。 JavaScript 引擎在執行任何代碼之前都會創建一個新的執行上下文,這個新的執行上下文稱爲全局執行上下文。
全局執行上下文是 JavaScript 引擎創建的默認執行上下文。所有不在函數或對象內的全局代碼都將在全局執行上下文中執行。
每個執行上下文(不僅僅是全局上下文)都將包含兩件事:
A global object——提供在當前環境中任何地方都可用的變量和函數。在瀏覽器中,全局對象被命名爲window,使用 Node.js 時,全局對象被命名爲 global。
A this object – this 關鍵字指向代碼所屬的當前執行上下文對象。
即使我們沒有編寫任何代碼,JavaScript 引擎仍然會創建一個全局執行上下文。 JavaScript 是一種單線程編程語言,因此 JavaScript 執行不可能有多個全局執行上下文。
最初,全局執行上下文有兩個階段:
創建——在這個階段,全局對象和 this 關鍵字被創建。 爲創建的變量和函數分配內存。 你可以看到我們的變量持有“未定義”的值。
執行——在這個階段,代碼的執行開始了。 在我們的示例中,我們爲變量賦值並定義了函數。
2. 函數執行上下文
執行函數時會創建函數執行上下文。
創建的新執行上下文是函數執行上下文。它具有相同的階段,我們可以訪問一個稱爲參數的特殊值。參數值是我們在執行函數時傳遞給函數的參數。
一個函數可以在其中執行一個函數,依此類推。每次執行函數時,都會創建一個新的函數執行上下文。
3. eval 執行上下文
創建 eval 函數是爲了將字符串轉換爲可執行的 JavaScript 代碼。雖然看起來很強大,但不建議使用這個功能,因爲我們無法控制它的權限。
eval 函數的使用可能會使您的應用程序或服務受到注入攻擊。 eval 函數接收到的字符串可能是惡意字符串,可以完全破壞您的數據庫或應用程序。這就是爲什麼不推薦使用 eval 函數的原因。
JavaScript 的核心概念可以徹底改變開發現代應用程序的遊戲規則。執行上下文是瞭解 JavaScript 代碼如何在後臺運行的一個非常重要的概念。 它存在於每個編寫的 JavaScript 代碼中,它是學習其他 JavaScript 概念(如提升、閉包、作用域等)的要求之一。