摘要:預編譯發生在函數執行前也就是說函數執行時,預編譯已經結束。五總結理解預編譯需要明白變量函數聲明和變量賦值。預編譯階段,只進行變量函數聲明,不會進行變量的初始化即變量賦值,所有變量的值都是變量賦值是在解釋執行階段才進行的。
一、JS的概念
JavaScript ( JS ) 是一種具有函數優先的輕量級解釋型或即時編譯型的編程語言。二、JS語言特點 2.1 單線程
(1)JavaScript語言的一大特點就是單線程,也就是說,同一個時間只能做一件事。那么,為什么JavaScript不能有多個線程呢?這樣能提高效率。
(2)JavaScript的單線程,與它的用途有關。作為瀏覽器腳本語言,JavaScript的主要用途是與用戶互動,以及操作DOM。這決定了它只能是單線程,否則會帶來很復雜的同步問題。比如,假定JavaScript同時有兩個線程,一個線程在某個DOM節點上添加內容,另一個線程刪除了這個節點,這時瀏覽器應該以哪個線程為準?
2.2 解釋型語言(1)解釋一行,執行一行;不通篇編譯為一個文件再執行。
三、 JS執行過程 3.1 語法分析通篇掃描低級語法錯誤,但不執行。3.2 預編譯 3.3 解釋執行 四、JS的預編譯
(1)預編譯,簡單理解,就是在內存中開辟一塊空間,用來存放變量和函數。
(2)預編譯發生在函數執行前;也就是說函數執行時,預編譯已經結束。
4.1 變量 聲明提升變量聲明語句放到最前,賦值不變。
JavaScript的函數作用域是指在函數內聲明的所有變量在函數體內始終是有定義的,也就是說變量在聲明之前已經可用, 所有這種特性稱為聲明提前(hoisting),即JavaScript函數里的所有聲明(只是聲明,但不涉及賦值)都被提前到函數體的頂部,而變量賦值操作留在原來的位置。
(1)JavaScript 腳本在執行之前先進行預編譯,所以 ① 和 ③ 不會執行,而是先執行 ②,進行預編譯;
(2)因為預編譯階段是不對變量進行賦值的,即不進行初始化,所以 ② 也只執行前半部分 var a ,由于只聲明了變量,而沒有進行賦值,所以此時變量的值為 undefined;
(3)預編譯完畢之后,JavaScript 腳本開始執行,執行順序按照從上到下的順序執行。
4.2 函數聲明整體提升函數聲明語句將會被提升到外部腳本或者外部函數作用域的頂部。
(1)其實函數聲明 function test() {} 已經提升到 test() 之前,這也是預編譯導致的,所以函數 test() 能夠在定義之前執行,并且沒有報錯。
五、總結(1)理解預編譯需要明白 ①變量/函數聲明 和 ②變量賦值。
(2)預編譯階段,只進行 變量/函數聲明,不會進行變量的初始化(即變量賦值,所有變量的值都是 undefined);變量賦值 是在解釋執行階段才進行的。
閱讀更多
參考文章 JavaScript的預編譯
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/94782.html
摘要:一概念是一個單線程解釋型的編程語言。預編譯大致可分為步創建對象找形參和變量聲明,將形參和變量名作為屬性名,值為將實參值和形參統一在函數體里面找函數聲明,值賦予函數體。 一、JavaScript概念 JavaScript ( JS ) 是一個單線程、解釋型的編程語言。 二、JavaScript語言特點 2.1 單線程 JavaScript語言的一大特點就是單線程,也就是說,同一個時間只能...
摘要:大家都知道是解釋型語言,既然是解釋型語言,就是編譯一行,執行一行,那又何來預編譯一說呢腳本執行引擎都做了什么呢今天我們就來看看吧。全局域就是一切聲明的全局變量,全是的屬性等同于函數預編譯發生在函數執行前一刻。 大家都知道JavaScript是解釋型語言,既然是解釋型語言,就是編譯一行,執行一行,那又何來預編譯一說呢?腳本執行js引擎都做了什么呢?今天我們就來看看吧。 1-JavaScr...
摘要:所以覺得把這個執行的詳細過程整理一下,幫助更好的理解。類似的語法報錯的如下圖所示三預編譯階段代碼塊通過語法分析階段之后,語法都正確的下回進入預編譯階段。另開出新文章詳細分析,主要介紹執行階段中的同步任務執行和異步任務執行機制事件循環。 一、概述 js是一種非常靈活的語言,理解js引擎的執行過程對于我們學習js是非常有必要的。看了很多這方便文章,大多數是講的是事件循環(event loo...
摘要:我們在面試時,總會碰到一些奇奇怪怪的關于作用域的面試題,其實弄清楚原理,萬變不離其宗,大部分的面試題都可以得姐。 showImg(https://segmentfault.com/img/bV7Cri?w=1563&h=879); 我們在面試時,總會碰到一些奇奇怪怪的關于 作用域 的面試題,其實弄清楚原理,萬變不離其宗,大部分的面試題都可以得 ‘姐’。 所以,今天我們來談談 JavaS...
摘要:詞法作用域是一種靜態作用域這個例子的結果按靜態作用域來分析執行函數,先從函數內部查找是否有局部變量,如果沒有,就根據書寫的位置,查找上面一層的代碼,也就是等于,所以結果會打印。靜態作用域,決定的是作用域鏈的順序。 博客原文地址:https://finget.github.io/2018/03/01/javascriptPrecompile/看不明白的地方歡迎提問,有理解的不對的地方希望...
閱讀 1519·2021-11-23 09:51
閱讀 3639·2021-09-26 09:46
閱讀 2125·2021-09-22 10:02
閱讀 1818·2019-08-30 15:56
閱讀 3319·2019-08-30 12:51
閱讀 2224·2019-08-30 11:12
閱讀 2060·2019-08-29 13:23
閱讀 2323·2019-08-29 13:16