首頁 web前端 js教程 詳解JavaScript的運作原理

詳解JavaScript的運作原理

Feb 11, 2018 am 09:31 AM
javascript js 原理

本文主要跟大家從理論詳細分析了JavaScript運作原理以及知識點分享,對此有興趣的學習下吧。

JavaScript是一種基於物件的動態、弱型別腳本語言(以下簡稱JS),是一種解釋型語言,和其他的程式語言不同,如java/C++等編譯型語言,這些語言在程式碼執行前會進行通篇編譯,先編譯成字節碼(機器碼)。然後在執行。而JS不是這樣做的,JS是不需要編譯成中間碼,而是可以直接在瀏覽器中執行,JS運行過程可分為兩個階段,編譯和執行。 (可參考你不知道的JS這本書),當JS控制器轉到一段可執行的程式碼時(這段可執行程式碼就是編譯階段產生的),會創建與之對應的執行上下文(Excution Context簡稱EC)。執行上下文可以理解為執行環境(執行上下文只能由JS解釋器創建,也只能由JS解釋器使用,使用者是不可以操作該『物件』的)。

JS中的執行環境分為三類:

  • #全域環境:當JS引擎進入一個程式碼區塊時,如遇到<script>xxx</script>標籤,就是進入一個全域執行環境

  • 函數環境:當函數被呼叫時,在函數內部就形成了一個函數執行環境

  • eval():把字串單做JS程式碼執行,不建議使用

在一段JS程式碼中可能會產生多個執行上下文,在JS中用棧這種資料結構來管理執行上下文,棧的特徵是「先進後出,後進先出」,這種棧稱之為函數呼叫棧。

執行上下文的特點

  • 堆疊底永遠是全域執行上下文,有且僅有一個

  • 全域執行上下文只有在瀏覽器關閉時,才會彈出堆疊

  • 其他的執行上下文的數量沒有限制

  • 堆疊頂永遠是當前活動執行上下文,其餘的都處於等待狀態中,一旦執行完畢,立即彈出棧,然後控制權交回下一個執行上下文

  • 函數只有在每次被呼叫時,才會為其建立執行上下文,函數被宣告時是沒有的。

執行上下文可以形象的理解為一個普通的JS對象,一個執行上下文的生命週期大概包含兩個階段:

建立階段

#此階段主要完成三件事件,1、建立變數物件2、建立作用域鏈3、確定this指向

#執行階段

##此階段主要完成變數賦值、函數呼叫、其他操作

變數物件(VO)的建立過程

  • 1、根據函數參數,建立並初始化arguments對象,給予arguments物件加入屬性"0","1","2","3"等屬性,其初始值為undefined,並設定arguments.length值為實際傳入參數的個數。

  • 2、尋找function函數聲明,在變數物件上新增屬性,屬性名就是函數名,屬性值就是函數的參考值,如果已經存在同名的,則直接覆寫

  • 3、尋找var變數宣告(尋找變數時,會把函數的參數等價於var聲明,所以在VO中也會加入和參數名稱一樣的屬性,初始值也是undefined),在變數物件中加入屬性,屬性名就是變數名,屬性值是undefined,如果已經存在同名的,則不處理

如果存在同名識別碼(函數、變數),則函數可以覆蓋變量,函數的優先權高於變數

變數物件(OV)和激活物件(AO)是同一個東西,在不同時期的兩個叫法。在創建時期叫變數對象,在執行時期叫激活對象

以如下程式碼為例


#

var g_name="tom";
var g_age=20;
function g_fn(num){
 var l_name="kity";
 var l_age=18;
 function l_fn(){
  console.log(g_name + &#39;===&#39; + l_name + &#39;===&#39; + num);
 }
}
g_fn(10);
登入後複製

編譯階段

當JS控制器轉到這一段程式碼時,會建立一個執行上下文,G_EC


執行上下文的結構大概如下:


G_EC = {
 VO   : {},
 Scope_chain : [],
 this  : {}
}

/* VO的结构大概 */
VO = {
 g_name : undefined,
 g_age : undefined,
 g_fn : <函数在内存中引用值>
}

/* Scope_chain的大概结构如下 */
Scope_chain = [ G_EC.VO ] // 数组中第一个元素是当前执行上下文的VO,第二个是父执行上下文的VO,最后一个是全局执行上下文的VO,在执行阶段,会沿着这个作用域链一个一个的查找标识符,如果查到则返回,否知一直查找到全局执行上下文的VO

/* this */
this = undefined // 此时this的值是undefined
登入後複製

執行上下文一旦創建完畢,就立刻被壓入函數調用棧中,此時解釋器會悄悄的做一件事情,就是給當前VO中的函數添加一個內部屬性[[scope]],該屬性指向上面的作用域鏈。


g_fn.scope = [ global_EC.VO ] // 该scope属性只能被JS解释器所使用,用户无法使用
登入後複製

執行階段

一行一行執行程式碼,當遇到一個表達式時,就會去目前作用域鏈的中尋找VO對象,如果找到則傳回,如果找不到,則繼續尋找下一個VO對象,直到全域VO對象終止。


此階段可以有變數賦值,函數調用等操作,當解釋器遇到g_fn()時,就知道這是一個函數調用,然後立即為其創建一個函數執行上下文,fn_EC ,該上下文fn_EC同樣有兩個階段


分別是建立階段和執行階段。


在建立階段,對於函數執行上下文,在建立變數物件時,會多建立一個arguments對象,然後為arguments物件新增屬性:"0","1", "2"其初始值為undefined,

  • 尋找function函數宣告

  • 尋找var變數宣告

相關推薦:

JavaScript運行機制範例程式碼分析

javascript運行機制之this詳細介紹_基礎知識

JavaScript運行機制之事件循環(Event Loop)詳解_javascript技巧

以上是詳解JavaScript的運作原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱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

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

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1424
52
Laravel 教程
1322
25
PHP教程
1270
29
C# 教程
1249
24
建議:優秀JS開源人臉偵測辨識項目 建議:優秀JS開源人臉偵測辨識項目 Apr 03, 2024 am 11:55 AM

人臉偵測辨識技術已經是一個比較成熟且應用廣泛的技術。而目前最廣泛的網路應用語言非JS莫屬,在Web前端實現人臉偵測辨識相比後端的人臉辨識有優勢也有弱勢。優點包括減少網路互動、即時識別,大大縮短了使用者等待時間,提高了使用者體驗;弱勢是:受到模型大小限制,其中準確率也有限。如何在web端使用js實現人臉偵測呢?為了實現Web端人臉識別,需要熟悉相關的程式語言和技術,如JavaScript、HTML、CSS、WebRTC等。同時也需要掌握相關的電腦視覺和人工智慧技術。值得注意的是,由於Web端的計

nohup的作用及原理解析 nohup的作用及原理解析 Mar 25, 2024 pm 03:24 PM

nohup的作用及原理解析在Unix和類Unix作業系統中,nohup是一個常用的命令,用於在後台運行命令,即便用戶退出當前會話或關閉終端窗口,命令仍然能夠繼續執行。在本文中,我們將詳細解析nohup指令的作用和原理。一、nohup的作用後台運行命令:透過nohup命令,我們可以讓需要長時間運行的命令在後台持續執行,而不受用戶退出終端會話的影響。這在需要運行

深入探討Struts框架的原理與實踐 深入探討Struts框架的原理與實踐 Feb 18, 2024 pm 06:10 PM

Struts框架的原理解析與實務探索Struts框架作為JavaWeb開發中常用的MVC框架,具有良好的設計模式和可擴展性,廣泛應用於企業級應用程式開發中。本文將對Struts框架的原理進行解析,並結合實際程式碼範例進行探索,幫助讀者更好地理解和應用該框架。一、Struts框架的原理解析1.MVC架構Struts框架是基於MVC(Model-View-Con

深入理解MyBatis中的批次Insert實作原理 深入理解MyBatis中的批次Insert實作原理 Feb 21, 2024 pm 04:42 PM

MyBatis是一款流行的Java持久層框架,廣泛應用於各種Java專案。其中,批次插入是常見的操作,可以有效提升資料庫操作的效能。本文將深入探討MyBatis中批量的Insert實作原理,並結合具體的程式碼範例進行詳細解析。 MyBatis中的批次Insert在MyBatis中,批量Insert操作通常使用動態SQL來實作。透過建構一條包含多個插入值的S

深入探討Linux RPM工具的功能與原理 深入探討Linux RPM工具的功能與原理 Feb 23, 2024 pm 03:00 PM

Linux系統中的RPM(RedHatPackageManager)工具是安裝、升級、解除安裝和管理系統軟體套件的強大工具。它是RedHatLinux系統中常用的軟體包管理工具,也被許多其他Linux發行版採用。 RPM工具的角色非常重要,它使得系統管理員和使用者能夠方便地管理系統上的軟體包。透過RPM,使用者可以輕鬆安裝新的軟體包,升級現有的軟體

MyBatis分頁插件原理詳解 MyBatis分頁插件原理詳解 Feb 22, 2024 pm 03:42 PM

MyBatis是一個優秀的持久層框架,它支援基於XML和註解的方式操作資料庫,簡單易用,同時也提供了豐富的插件機制。其中,分頁插件是使用頻率較高的插件之一。本文將深入探討MyBatis分頁外掛的原理,並結合具體的程式碼範例進行說明。一、分頁外掛原理MyBatis本身並沒有提供原生的分頁功能,但可以藉助外掛程式來實現分頁查詢。分頁插件的原理主要是透過攔截MyBatis

js和vue的關係 js和vue的關係 Mar 11, 2024 pm 05:21 PM

js和vue的關係:1、JS作為Web開發基石;2、Vue.js作為前端框架的崛起;3、JS與Vue的互補關係;4、JS與Vue的實踐應用。

深度解析Linux chage指令的功能與工作原理 深度解析Linux chage指令的功能與工作原理 Feb 24, 2024 pm 03:48 PM

Linux系統中的chage指令是用來修改使用者帳號的密碼失效日期的指令,也可以用來修改帳號最長的可用日期等。此指令在管理使用者帳號安全性上扮演著非常重要的作用,可以有效控制使用者密碼的使用期限,並增強系統的安全性。 chage指令的使用方法:chage指令的基本語法為:chage[選項]使用者名稱例如,要修改使用者「testuser」的密碼失效日期,可以使用下列命

See all articles