您好,登錄后才能下訂單哦!
這篇文章主要介紹“javascript是怎么解析的”的相關(guān)知識,小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“javascript是怎么解析的”文章能幫助大家解決問題。
javascript是一種解釋型的腳本語言,可以由瀏覽器動態(tài)解析和執(zhí)行。javascript本身就是游覽器可以直接識別的,javascript的解釋器被稱為javascript引擎,是瀏覽器默認(rèn)的一部分。
本教程操作環(huán)境:windows7系統(tǒng)、javascript1.8.5版、Dell G3電腦。
javascript是一種解釋型的腳本語言,它不同于java或者c#這種編譯語言,不需要編譯成瀏覽器可識別的語言,而是由瀏覽器動態(tài)解析和執(zhí)行的。(本身就是瀏覽器可以直接識別,javascript的解釋器被稱為javascript引擎,是瀏覽器默認(rèn)的一部分)
1.代碼塊
javascript中的代碼塊是指由<script>標(biāo)簽分割的代碼段。
<script type="text/javascript"> console.log("這是代碼塊一"); </script> <script type="text/javascript"> console.log("這是代碼塊二"); </script>
JS是按照代碼塊來進(jìn)行編譯和執(zhí)行的,代碼塊間相互獨(dú)立,但變量和方法共享。
<script type="text/javascript"> console.log(str); //因?yàn)闆]有定義str,所以瀏覽器會出錯(cuò),下面的不能運(yùn)行 console.log("我是代碼塊一"); //沒有運(yùn)行到這里 var test = "我是代碼塊一變量"; </script> <script type="text/javascript"> console.log("我是代碼塊二"); //這里有運(yùn)行到 console.log(test); //輸出undefined,因?yàn)榈谝粋€(gè)代碼塊執(zhí)行第一行代碼的時(shí)候游覽器報(bào)錯(cuò),代碼塊中第一行下面的所有代碼都沒有執(zhí)行。故test的定義了,但沒有賦值。(為什么test定義了卻沒有賦值,因?yàn)樽兞可昝鞯奶嵘? </script>
上面的代碼中代碼塊一中運(yùn)行報(bào)錯(cuò),但不影響代碼塊二的執(zhí)行,這就是代碼塊間的獨(dú)立性,而代碼塊二中能調(diào)用到代碼一中的變量,則是塊間共享性
2.聲明式函數(shù)與賦值式函數(shù)
<script type="text/javascript"> function Fn(){ //聲明式函數(shù) console.log('我是聲明式函數(shù)'); } var Fn = function{ //賦值式函數(shù) console.log('我是賦值式函數(shù)'); } </script>
聲明式函數(shù)與賦值式函數(shù)的區(qū)別在于:在JS的預(yù)編譯期,聲明式函數(shù)將會先被提取出來,然后才按順序執(zhí)行js代碼。
預(yù)編譯期與執(zhí)行期:
事實(shí)上,JS的解析過程分為兩個(gè)階段:預(yù)編譯期(預(yù)處理)與執(zhí)行期。
預(yù)編譯期JS會對本代碼塊中的所有聲明的變量和函數(shù)進(jìn)行處理,但需要注意的是此時(shí)處理函數(shù)的只是聲明式函數(shù),而且變量也只是進(jìn)行了聲明但未進(jìn)行初始化以及賦值。
<script type="text/javascript"> Fn(); //執(zhí)行結(jié)果:"執(zhí)行了函數(shù)2",同名函數(shù)后者會覆蓋前者 function Fn(){ //函數(shù)1 console.log("執(zhí)行了函數(shù)1"); } function Fn(){ //函數(shù)2 console.log("執(zhí)行了函數(shù)2"); } </script>
<script type="text/javascript"> Fn(); //執(zhí)行結(jié)果:"執(zhí)行了聲明式函數(shù)",在預(yù)編譯期聲明函數(shù)及被處理了,所以即使Fn()調(diào)用函數(shù)放在聲明函數(shù)前也能執(zhí)行。 function Fn(){ //聲明式函數(shù) console.log("執(zhí)行了聲明式函數(shù)"); } var Fn = function(){ //賦值式函數(shù) console.log("執(zhí)行了賦值式函數(shù)"); } </script>
//代碼塊一 <script type="text/javascript"> console.log(str);//瀏覽器報(bào)錯(cuò),但并沒有輸出信息 </script> //代碼塊二 <script type="text/javascript"> console.log(str);//控制臺輸出"undefined" var str = "aaa"; </script> //js在預(yù)處理期對變量進(jìn)行了聲明處理,但是并沒有進(jìn)行初始化與賦值,所以導(dǎo)致代碼塊二中的變量是unfiened的,而代碼一中的變量是完全不存在的,所以瀏覽器報(bào)錯(cuò)。
我們來看看下面這個(gè)例子
<script type="text/javascript"> Fn(); //瀏覽器報(bào)錯(cuò):"undefined" </script> <script type="text/javascript"> function Fn(){ //函數(shù)1 console.log("執(zhí)行了函數(shù)1"); } </script>
因?yàn)閖avascript的引擎是按照代碼塊來進(jìn)行預(yù)處理和執(zhí)行的,也就是說預(yù)處理的只是執(zhí)行到的代碼塊的聲明函數(shù)和變量,而對于還未加載的代碼塊,是沒法進(jìn)行預(yù)處理的,這也是邊編譯邊處理的核心所在。
關(guān)于“javascript是怎么解析的”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點(diǎn)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。