中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

web開發中JavaScript代碼執行的先后順序問題

發布時間:2021-08-02 13:38:29 來源:億速云 閱讀:180 作者:小新 欄目:web開發

這篇文章主要介紹了web開發中JavaScript代碼執行的先后順序問題,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

一、js--->單線程

   嚴格意義上來說,javascript沒有多線程的概念,所有的程序都是單線程依次執行的。

  1、什么是單線程?

  通俗點說,就是代碼在執行過程中,另一段代碼想要執行就必須等當前代碼執行完成后才可以進行。我們拿一段代碼來解釋一下吧

 for(var i=1;i<=3;i++){
   setTimeout(function(){
     console.log(i); //輸出:4,4,4
   },0)
 }

  我們來看一下上面的這段代碼,既然延時器時間設置為0,那么應該執行一遍循環就應該立即打印出一個i,但是最終的打印結果為:4,4,4。之所以會出現上面的結果,正是因為js代碼是單線程應用。

  在執行過程中,先遇到for循環,for循環先進入線程。當i=1時,循環走到setTimeOut后,此時的for循環還沒有執行完成,setTimeOut就會被放入一個地方(線程池)等待執行。此時for循環繼續執行,當i=2時,for循環仍沒有執行完,這時的setTimeOut仍會被放在線程池中等待執行……依次類推,直到for循環轉完3遍后,for循環執行完了,此時線程空閑了,在線程池中等待執行的setTimeOut依次執行打印i,而for循環執行完成后,i變成了4,所以打印出了三個4。

  2、如果想要改變上面的狀況可以運用以下代碼

//將var變為let
for(let i=1; i<=3; i++){
  setTimeOut(function(){
    console.log(i); //輸出的結果為1,2,3
  },0);
}
//用自執行函數進行包裹
for(var i=1; i<=3; i++){
  !function(i){
    setTimeOut(function(){
      console.log(i); //輸出的結果為1,2,3
    },0);
  }(i)
}

二、js中的函數作用域和代碼的執行

  >>>函數作用域

我們先來了解一下以下幾個概念:

  1、在js語言中,沒有類似于c語言這樣的塊級作用域。

  2、js語言中的頂級作用域為window對象范圍內,稱為全局作用域,在全局作用域中聲明的變量為全局變量。

  3、js函數范圍內的變量只能在函數內部使用,函數外部無法使用,這樣的變量為局部變量。

  4、js函數可以嵌套,多個函數的嵌套構成了作用域的層層嵌套,這稱為js中的作用域鏈。

  5、js作用域鏈變量訪問規則:

    (1)、當前作用域內存在要訪問的變量時,則使用當前作用域中的變量。

       (2)、當前作用域中不存在要訪問的變量時,則會到上一層作用域中尋找,直到全局作用域。

  >>>執行順序

   js代碼執行分為兩個部分:

  1、代碼的檢查裝載階段(預編譯階段),此階段進行變量和函數的聲明,但是不對變量進行賦值,變量的默認值為undefined。

  2、代碼的執行階段,此階段對變量進行賦值和函數的聲明。

看了上面的一些具體的概念,我們拿一段代碼進行舉例說明:

var a=1; //聲明了一個全局變量
function func(){
  console.log(a); //輸出:undefined。打印a,而在func這個作用域中已經聲明了a變量,按照js的執行順序,此時的a并未被賦值。
  var a=1;
  console.log(a); //輸出:1。
}
func();

  看上面的代碼:第一個a輸出undefined。原因:js作用域鏈的訪問規則,當前作用域內存在要訪問的變量a,所以使用當前作用域中的變量。再根據js代碼的執行順序,此時的a只是聲明了而并未被賦值,默認為undefined,所以輸出undefined。

  而第二個a,輸出1,正是因為此時的a已經被聲明且被賦值,所以a輸出1。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“web開發中JavaScript代碼執行的先后順序問題”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

红河县| 寿光市| 金湖县| 长岭县| 图片| 廊坊市| 石首市| 宜阳县| 永修县| 福鼎市| 湘西| 玛曲县| 平舆县| 金寨县| 屏东市| 柳州市| 寿宁县| 堆龙德庆县| 新干县| 花莲市| 右玉县| 娄底市| 松江区| 重庆市| 巴彦淖尔市| 长沙市| 长治市| 洛宁县| 安多县| 额敏县| 屯留县| 松阳县| 山阳县| 佛坪县| 白水县| 洛阳市| 越西县| 驻马店市| 海林市| 射阳县| 明光市|