首頁 web前端 js教程 基礎的JavaScript知識總結(八)預編譯執行過程

基礎的JavaScript知識總結(八)預編譯執行過程

Mar 10, 2018 pm 01:31 PM
javascript js 編譯

這次帶給大家基礎的JavaScript知識總結,總共有十一個知識點,基礎的JavaScript知識總結(八)預編譯執行過程下面就是實戰案例,一起來看一下。

JS運行三部曲

第一步:語法分析

第二部:預編譯

第三部:解釋執行

預編譯

語法分析也叫語意分析,文法分析他是通篇執行的一個過程,例如我寫了好多行程式碼,這些程式碼在執行的時候他是解釋一行執行一行,但是在執行之前系統執行的第一步它會掃描一遍,看看有沒有低級的語法錯誤,比如少些個括號,帶個中文之類的,它會通篇掃描一遍,但不執行,這個通篇掃描的過程叫語法分析,通篇掃描之後它會預編譯,然後在解釋一行執行一行,也就是解釋執行

預編譯前奏

imply global 暗示全局变量: 即任何变量,如果变量未经声明就赋值,自变量就位全局对象所有
eg : a = 123;
eg : var a = b = 123;
登入後複製

一切宣告的全域變數,全是window的屬性

  eg:var a = 123;===> window.a = 123;
//例子:
   function test (){        console.log("a");
   }  
   test();//成功打印出a,
   box();//写在方法之前也成功打印出a,为什么能执行就是有预编译的过程
   function box (){        console.log("a");
   }    
   var a =123;    console.log(a);//输出123
   console.log(a);//输出undefined,不报错;
    var a = 123;    
    //但是如果直接打印会报错;
    console.log(b)//报错
    //也是预编译的效果
    
    //如果想偷懒记住两句话
    //函数声明整体提升
    //变量 声明提升
登入後複製

解釋一下函數宣告正題提升: 如果你寫一個函數宣告,不管你寫到哪裡,系統總是會把這個函數提到邏輯的最前面,所以你不管在哪裡調用,在上面調用也好,下面調用也罷,本質上他都是在函數的下面調用,他會把函數聲明永遠給你提升到邏輯的最前面

變數宣告提升例如

var a = 123;//其實他是兩部var a;//先宣告變數
   a = 123;//在變數賦值

所以系統提升的變數而不是變數帶著值一起提升,所以在例子中a是印出undefined;

注意,這兩句話不是萬能的

例如

function a(a){    var a = 123;    var a = function(){        
    }
    a();
}var a = 123;
登入後複製

這個就不是那兩句話可以解決的

在解釋上面的之前,要先用弄什麼是impiy global

imply globa:暗示全域變數: 即任何變數,如果變數未經宣告就賦值,自變數就位全域物件所有

eg : a = 123;

eg : var a = b = 123;

a = 10;console.log(a);//打印10然後在window屬性上有了awindow.a//10var b = 20;//你聲明了window也有bwindow就是全域的域

預先編譯正式

建立AO物件

找形參與變數宣告,將變數與形參名作為AO屬性名,值為undefined

將實參值和形參統一

在函數體裡面找函數宣告,值賦予函數體

function fn (a){    console.log(a);    
    var a = 123;    console.log(a);    
    function a (){};    console.log(a);    
    var b = function (){        
    }    console.log(b);        
}
fn(1);
登入後複製

這個例子,參數,變數,函數名字都叫a,首先可以確定的是肯定會發生一個覆蓋的現象,這樣子就很矛盾前面說了函數的預編譯執行在函數執行的前一刻,可以這樣子說,預編譯就把這些矛盾給調和了.

首先預先編譯的

第一步: 創建了一個AO物件,全名為Activation object 也就是作用域,也叫執行期上下文

AO{    
}
登入後複製

第二步: 找形參和變數宣告,將變數和形參名作為AO屬性名,值為undefined

AO{    a : undefined
    b : undefined
}
登入後複製

第三個步驟: 將實參值和形參統一

AO{    a : 1;    b : undefined
}
登入後複製

第四步: 在函數體裡面找函數宣告,值賦予函數體

AO{    a : 1,    b : undefined,    //b是是函数表达式,不是函数声明,所以不变
    //然后有a了 有b了,然后将这个函数声明的名作为AO对象挂起来
    d : 
}//然后值赋予函数体,也就是把a和b的属性值,变成函数体//覆盖掉a 和b的的属性值//也就变成下面的//因为第四步的优先级最高AO{    a : function a () {}
    b : undefined,    //b是是函数表达式,不是函数声明,所以不变
    d : function d () {}
}
登入後複製

至此預編譯過程結束,開始執行程式碼,執行函數

#然後我們在看上面的範例

//预编译结果AO{    a : function a () {}
    b : undefined,    d : function d () {}
}//开始执行代码function fn (a){    //第一步开始打印a
    //根据上面预编译的结果,
    //所以打印结果是function a () {}
    console.log(a);    
    //第二步执行 var a = 123;
    //因为在预编译的第二步里面,变量已经提升了
    //所以第二步只执行的赋值
    //a = 123;去AO对象里面去找a
    //也就变成
    //AO{
        //a : 123   这个才是a的存储值
        //b : undefined,
        //d : function d () {}
    //}
    var a = 123;    //所以打印出123
    console.log(a);    //因为这句在话在预编译的时候系统已经看了
    //所以不在看这句话
    function a (){};    //所以下面的console.log(a)
    //还是打印123;
    console.log(a);    //一样下面的var b这句话在预编译的时候已经看了,所以不在看
    //AO{
        //a : 123   
        //所以b的值变成function(){}
        //b : function(){}
        //d : function d () {}
    //}
    var b = function (){
        
    }    //所以打印出function(){}
    console.log(b);
        
}
登入後複製

fn(1);

我們在看個例子

function test(a , b){    console.log(a);
    c = 0;    var c;
    a = 3;
    b = 2;    console.log(b);    function b () {}    console.log(b);
}//这下我们就很快的得出打印的东西//a-->1//b-->2//b-->2
登入後複製

預編譯不只會在函數體裡面,也會發生在全域裡面

全域裡面的第一步是先生成GO Global Object,其他一樣

GO === window

那麼問題來了是GO先還是AO先

答案是先執行GO

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

相關閱讀:

基礎的JavaScript知識總結(六)函數、初始作用域(上)

基礎的JavaScript知識總結(六)函數、初始作用域(下)

#基礎的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脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 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)

建議:優秀JS開源人臉偵測辨識項目 建議:優秀JS開源人臉偵測辨識項目 Apr 03, 2024 am 11:55 AM

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

股票分析必備工具:學習PHP和JS繪製蠟燭圖的步驟 股票分析必備工具:學習PHP和JS繪製蠟燭圖的步驟 Dec 17, 2023 pm 06:55 PM

股票分析必備工具:學習PHP和JS繪製蠟燭圖的步驟,需要具體程式碼範例隨著網路和科技的快速發展,股票交易已成為許多投資者的重要途徑之一。而股票分析是投資人決策的重要一環,其中蠟燭圖被廣泛應用於技術分析。學習如何使用PHP和JS繪製蠟燭圖將為投資者提供更多直觀的信息,幫助他們更好地做出決策。蠟燭圖是一種以蠟燭形狀來展示股票價格的技術圖表。它展示了股票價格的

WebSocket與JavaScript:實現即時監控系統的關鍵技術 WebSocket與JavaScript:實現即時監控系統的關鍵技術 Dec 17, 2023 pm 05:30 PM

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

PHP與JS開發技巧:掌握繪製股票蠟燭圖的方法 PHP與JS開發技巧:掌握繪製股票蠟燭圖的方法 Dec 18, 2023 pm 03:39 PM

隨著網路金融的快速發展,股票投資已經成為了越來越多人的選擇。而在股票交易中,蠟燭圖是常用的技術分析方法,它能夠顯示股票價格的變動趨勢,幫助投資人做出更精準的決策。本文將透過介紹PHP和JS的開發技巧,帶領讀者了解如何繪製股票蠟燭圖,並提供具體的程式碼範例。一、了解股票蠟燭圖在介紹如何繪製股票蠟燭圖之前,我們首先需要先了解什麼是蠟燭圖。蠟燭圖是由日本人

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

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的實踐應用。

如何在JavaScript中取得HTTP狀態碼的簡單方法 如何在JavaScript中取得HTTP狀態碼的簡單方法 Jan 05, 2024 pm 01:37 PM

JavaScript中的HTTP狀態碼取得方法簡介:在進行前端開發中,我們常常需要處理與後端介面的交互,而HTTP狀態碼就是其中非常重要的一部分。了解並取得HTTP狀態碼有助於我們更好地處理介面傳回的資料。本文將介紹使用JavaScript取得HTTP狀態碼的方法,並提供具體程式碼範例。一、什麼是HTTP狀態碼HTTP狀態碼是指當瀏覽器向伺服器發起請求時,服務

Apache PHP編譯安裝詳細步驟 Apache PHP編譯安裝詳細步驟 Mar 08, 2024 pm 01:15 PM

Apache和PHP是網站開發中常用的兩種工具,編譯安裝可以讓我們更有彈性地設定和管理它們。以下將詳細介紹Apache和PHP的編譯安裝步驟,包含具體的程式碼範例。步驟一:下載Apache和PHP源碼包首先,我們需要下載最新版本的Apache和PHP源碼包。你可以造訪Apache官網(https://httpd.apache.org)和PHP官網(https:

See all articles