亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

深入理解javascript的執行順序

2019-11-20 20:52:02
字體:
來源:轉載
供稿:網友

如果你不能理解javaScript語言的運行機制,或者簡單地說,你不能掌握javascript的執行順序,那你就猶如伯樂駕馭不了千里馬,讓千里馬脫韁而出,四處亂竄。

那么JavaScript是怎么來進行解析的嗎?它的執行順序又是如何的呢?在了解這些之前,我們先來認識幾個重要的術語:

1、代碼塊
JavaScript中的代碼塊是指由<script>標簽分割的代碼段。例如:

復制代碼 代碼如下:

<script type="text/javascript">
      alert("這是代碼塊一");
</script>
<script type="text/javascript">
      alert("這是代碼塊二");
</script>

JS是按照代碼塊來進行編譯和執行的,代碼塊間相互獨立,但變量和方法共享。什么意思呢? 舉個例子,你就明白了:

復制代碼 代碼如下:

<script type="text/javascript">
      alert(str);//因為沒有定義str,所以瀏覽器會出錯,下面的不能運行
      alert("我是代碼塊一");//沒有運行到這里
      var test = "我是代碼塊一變量";
</script>
<script type="text/javascript">
      alert("我是代碼塊二"); //這里有運行到
      alert(test); //彈出"我是代碼塊一變量"
</script>

上面的代碼中代碼塊一中運行報錯,但不影響代碼塊二的執行,這就是代碼塊間的獨立性,而代碼塊二中能調用到代碼一中的變量,則是塊間共享性。

2、聲明式函數與賦值式函數


JS中的函數定義分為兩種:聲明式函數與賦值式函數。

復制代碼 代碼如下:

<script type="text/javascript">
     function Fn(){ //聲明式函數

     }

     var Fn = function{  //賦值式函數

     }
</script>

聲明式函數與賦值式函數的區別在于:在JS的預編譯期,聲明式函數將會先被提取出來,然后才按順序執行js代碼。

3、預編譯期與執行期


事實上,JS的解析過程分為兩個階段:預編譯期(預處理)與執行期。

預編譯期JS會對本代碼塊中的所有聲明的變量和函數進行處理(類似與C語言的編譯),但需要注意的是此時處理函數的只是聲明式函數,而且變量也只是進行了聲明但未進行初始化以及賦值。

復制代碼 代碼如下:

<script type="text/javascript">
     Fn();  //執行結果:"執行了函數2",同名函數后者會覆蓋前者
     function Fn(){ //函數1
        alert("執行了函數1");
     }

     function Fn(){  //函數2
        alert("執行了函數2");
     }
</script> 
<script type="text/javascript">
      Fn();  //執行結果:"執行了聲明式函數",在預編譯期聲明函數及被處理了,所以即使Fn()調用函數放在聲明函數前也能執行。
      function Fn(){ //聲明式函數
         alert("執行了聲明式函數");
      }

      var Fn = function(){  //賦值式函數
         alert("執行了賦值式函數");
      }
</script>

//代碼塊一
<script type="text/javascript">
      alert(str);//瀏覽器報錯,但并沒有彈出信息窗
</script>
//代碼塊二
<script type="text/javascript">
      alert(str); //彈窗"undefined"
      var str = "aaa";
</script>
//js在預處理期對變量進行了聲明處理,但是并沒有進行初始化與賦值,所以導致代碼塊二中的變量是unfiened的,而代碼一中的變量是完全不存在的,所以瀏覽器報錯。

理解了上面的幾個術語,相信大家對JS的運行機制已經有了個大概的印象了,現在我們來看個例子:

復制代碼 代碼如下:

<script type="text/javascript">
      Fn();  //瀏覽器報錯:"undefined"
</script>
<script type="text/javascript">
      function Fn(){ //函數1
          alert("執行了函數1");
      }
</script>

為什么運行上面的代碼瀏覽器會報錯呢?聲明函數不是會在預處理期就會被處理了嗎,怎么還會找不到Fn()函數呢?其實這是一個理解誤點,我們上面說了JS引擎是按照代碼塊來順序執行的,其實完整的說應該是按照代碼塊來進行預處理和執行的,也就是說預處理的只是執行到的代碼塊的聲明函數和變量,而對于還未加載的代碼塊,是沒法進行預處理的,這也是邊編譯邊處理的核心所在。

現在,讓我們來總結整理下:

復制代碼 代碼如下:

  step 1.  讀入第一個代碼塊。
  step 2.  做語法分析,有錯則報語法錯誤(比如括號不匹配等),并跳轉到step5。
  step 3.  對var變量和function定義做“預編譯處理”(永遠不會報錯的,因為只解析正確的聲明)。
  step 4.  執行代碼段,有錯則報錯(比如變量未定義)。
  step 5.  如果還有下一個代碼段,則讀入下一個代碼段,重復step2。
  step6. 結束。

而根據HTML文檔流的執行順序,需要在頁面元素渲染前執行的js代碼應該放在<body>前面的<script>代碼塊中,而需要在頁面元素加載完后的js放在</body>元素后面,body標簽的onload事件是在最后執行的。
復制代碼 代碼如下:

<script type="text/javascript">
    alert("first");
    function Fn(){
     alert("third");
    }
</script>
<body onload="Fn()">

</body>
<script type="text/javascript">
    alert("second");
</script>

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
一道本无吗dⅴd在线播放一区| 精品女厕一区二区三区| 欧美超级免费视 在线| 久久久久国色av免费观看性色| 色综合伊人色综合网站| 日本久久久久久久久| 色噜噜亚洲精品中文字幕| 97精品在线观看| 国产精品丝袜白浆摸在线| 日韩电影大全免费观看2023年上| 91精品国产色综合| 亚洲女人初尝黑人巨大| 亚洲成色777777在线观看影院| www.欧美精品| 日韩久久精品成人| 欧美激情区在线播放| 日韩暖暖在线视频| 日韩激情片免费| 国产视频精品va久久久久久| 性视频1819p久久| 国产精自产拍久久久久久| 日韩成人小视频| 中文字幕一精品亚洲无线一区| 国产精品美女999| 亚洲成人精品视频在线观看| 国产一区二区三区18| 国产成人精品电影久久久| 亚洲高清福利视频| 亚洲激情免费观看| 欧美激情日韩图片| 亚洲自拍偷拍一区| 国色天香2019中文字幕在线观看| 国产一区二区黑人欧美xxxx| 久久久久久国产精品美女| 中文字幕不卡在线视频极品| 精品国产乱码久久久久久虫虫漫画| 成人444kkkk在线观看| 国产在线一区二区三区| 欧美成人精品不卡视频在线观看| 91精品久久久久久久久久久| 欧美精品福利视频| 疯狂做受xxxx高潮欧美日本| 亲爱的老师9免费观看全集电视剧| 中国日韩欧美久久久久久久久| 91干在线观看| 亚洲图片欧洲图片av| 午夜精品久久久久久久99热| 亚洲美女av网站| 久久99精品久久久久久青青91| 欧美激情第99页| 日韩**中文字幕毛片| 97视频人免费观看| 久久久亚洲成人| 国产精品网址在线| 大胆人体色综合| 日韩av123| 国产精品青青在线观看爽香蕉| 亚洲国产中文字幕在线观看| 97热在线精品视频在线观看| 亚洲国产小视频在线观看| 欧美精品18videos性欧美| 九九热最新视频//这里只有精品| 国产成人拍精品视频午夜网站| 国产成人av网址| 91久久嫩草影院一区二区| 国产精品狠色婷| 日韩欧美在线第一页| 久久电影一区二区| 亚洲国产精彩中文乱码av在线播放| 海角国产乱辈乱精品视频| 成人激情免费在线| 成人免费看吃奶视频网站| 日本成人在线视频网址| 91免费电影网站| 久久99亚洲热视| 久热精品视频在线| 亚洲女人初尝黑人巨大| 日韩精品极品在线观看播放免费视频| 68精品久久久久久欧美| 亚洲欧美另类国产| 国产自产女人91一区在线观看| 亚洲精品中文字幕av| 成人免费午夜电影| 久久精品2019中文字幕| 国产精品国内视频| 久久久久www| 92版电视剧仙鹤神针在线观看| www日韩中文字幕在线看| 国产精品jvid在线观看蜜臀| 欧美黑人又粗大| 久久久99久久精品女同性| 欧美日韩性视频在线| 91黑丝高跟在线| 日韩中文字幕在线视频| 97精品一区二区视频在线观看| 欧美亚洲国产另类| 97超级碰在线看视频免费在线看| 国产精品第10页| 亚洲在线免费观看| 一区二区三区动漫| 2021久久精品国产99国产精品| 亚洲欧美综合区自拍另类| 亚洲欧洲一区二区三区久久| 欧美在线视频网| 亚洲mm色国产网站| 日韩女优人人人人射在线视频| 欧美小视频在线| 人人做人人澡人人爽欧美| 91国在线精品国内播放| 亚洲精品按摩视频| 国产成人精品久久| 精品久久久久久久久久久久| 欧美性猛交xxxx乱大交极品| 亚洲国产精品专区久久| 亚洲电影中文字幕| 久久夜色撩人精品| 国产mv免费观看入口亚洲| 一本色道久久88精品综合| 91最新国产视频| 中文字幕无线精品亚洲乱码一区| 色综合久久久888| 欧美午夜激情在线| 色妞欧美日韩在线| 亚洲人成电影网站色xx| 日韩av网站电影| 亚洲www在线观看| 日韩成人网免费视频| 日韩中文字幕网| 97不卡在线视频| 欧美大片在线看| 欧美寡妇偷汉性猛交| 欧美亚洲另类激情另类| 久久成人免费视频| 亚洲аv电影天堂网| 亚洲福利视频网站| 精品日本高清在线播放| 国产精品美女免费视频| 国产精品稀缺呦系列在线| 久久久久久91香蕉国产| 日韩大陆欧美高清视频区| 91天堂在线观看| 欧美日产国产成人免费图片| 欧美电影免费观看大全| 亚洲国产一区二区三区在线观看| 精品综合久久久久久97| 亚洲伦理中文字幕| 亚洲性69xxxbbb| 精品久久久久久中文字幕一区奶水| 亚洲高清久久久久久| 国产精品久久久久久五月尺| 国产91九色视频| 国内精品久久久久久中文字幕| 欧美成人四级hd版| 国产精品91免费在线| 欧美一级在线亚洲天堂| 欧美成人精品一区| 国自在线精品视频| 国产日韩一区在线| 日韩成人在线免费观看| 在线观看国产精品日韩av| 粉嫩av一区二区三区免费野| 在线观看国产欧美| 亚洲国产精品久久久久久| 国产丝袜高跟一区|