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