1. 程式人生 > >JS預解釋的總結

JS預解釋的總結

命名 代碼執行 提前 變量 內存 fin 也會 屬性 func

  • 預解釋階段發生在創建了堆內存,讓代碼執行之前,對當前作用域中帶var和function的進行預解釋

    • 在瀏覽器解析執行代碼的時候,會提前把帶var和function的代碼聲明或定義,提前放在作用域的最前面執行,也就是瀏覽器把對這些變量的聲明提升到作用域的最前面
    • 函數數據類型會在預解釋階段同時聲明和定義
      • 瀏覽器會將函數的定義以字符串的形式存在一個新的命名空間(堆內存)
    • 在函數執行中,函數的形參也會進行預解釋,相當於var 形參
    • 在判斷體中
      • 無論判斷是否成立,裏面的代碼都進行預解釋,但是不進行定義(包括function)
      • 在新版本瀏覽器中,只要條件成立,他就會把函數執行(類似於在條件體內進行預解釋)
    • 在函數表達式中,等號右邊的function不進行預解釋
    • 自執行函數不進行預解釋,但是在他執行的時候開辟的棧內存進行預解釋
    • 在函數執行的時候,return後邊緊緊跟著的不進行預解釋,但是在return下面的依然進行預解釋,但是不執行不賦值
    • 變量名不能重復,變量當前的作用域中,同名的變量聲明,會覆蓋之前的聲明
    • 不帶var的變量,不進行預解釋,相當於給window動態添加了一個屬性
      • 當代碼執行到這的時候,才進行創建變量並賦值這個過程,所以在創建之前的調用,會報錯,變量 is not defined.
    • 在預解釋的時候,同一個名稱的變量,如果都是通過var聲明的,之前聲明過,後邊的聲明就不重新在聲明,如果是function,後邊會重新聲明和定義,但是後邊的定義會覆蓋前邊的
  • var num = 2;

    • 第一步:聲明這個變量(預解釋這一步)
    • 第二步:給num這個變量賦值2
  • 函數執行過程

    • 首先進行預解釋,形參和函數私有作用域中帶var和function進行提升
    • 如果形參在預解釋時被function重疊了,那麽形參消失,不能使用那個形參接受傳入函數的實參
    • 代碼開始從上到下執行,給形參賦值,代碼接著往下執行
    • return下面的代碼不執行了,返回值,返回產出

JS預解釋的總結