javascript變量的生命週期(閱讀文章總結)

原文連接:dmitripavlutin.com/variables-l…javascript

通常的,***變量聲明var***和***函數聲明function fun() {...}***,都會發生變量提高,即把變量和函數的定義移到做用域的頂部。java

可是let不會被提高,(有提高,可是無效,在定義以前不能使用)函數

  1. var的變量提高

    console.log(num); // => nudefined
    var num;
    num = 10;
    console.log(num); // => 10
    複製代碼

    變量在聲明以前被訪問,會被認定爲undefinedui

    console.log(fun); // => function fun() {....}
    fun(); // => 123
    function fun(){
    	return 123;
    }
    複製代碼

    函數在聲明以前被調用,能夠執行,由於末尾定義的函數被提高到做用域頂部了。spa

    console.log(fun()); //fun is not a function
    var fun = function() {
    	return 123;
    };
    複製代碼

    上面的這種屬於變量的聲明,fun在聲明以前被訪問了。code

  2. 底層:變量的生命週期

    當引擎訪問變量的時候,生命週期包括如下幾個階段:cdn

    1. 聲明階段:在做用域當中註冊一個變量。
    2. 初始化階段:分配內存,給做用域中的變量建立綁定,變量會自動初始化爲undefined。
    3. 賦值階段:給已經初始化的變量賦值。

    經過聲明階段可是沒有達到初始化階段的變量處於未定義狀態。blog

    經過初始化階段可是沒有達到賦值階段的變量處於undefined狀態。生命週期

  1. var 變量的生命週期

引擎處理var的過程ip

  1. javascript引擎遇到做用域裏面的全部***var***聲明的變量或函數。都會讓她們在其餘任何語句執行以前,經過變量的***聲明階段和初始化階段(初始化undefined)***。

  2. 在賦值語句(賦值階段)以前,這些變量的值都爲undefined而且均可以訪問。

  3. 嚴格來講,提高的概念是在函數做用域的頂部聲明和初始化變量。而且在聲明階段和初始化階段之間是沒有間隙的。

  4. 函數聲明的生命週期

引擎處理function fun() {...}的過程

  1. javascript引擎遇到做用域裏面全部的***function fun() {...}聲明的函數,都會讓它們在其餘語句執行以前經過***聲明,初始化,賦值階段

  2. 三個階段之間是沒有間隙的。

  3. let 變量的生命週期

let變量的處理方式和var不一樣,最主要的區別就是聲明階段初始化階段被分開了

  1. javascript引擎遇到做用域裏面全部的***let*** 語句,所聲明的變量或者函數就會在其餘語句執行以前經過***聲明階段***。在做用域中註冊它的名字。
  2. 接着javascript引擎便一行一行的解析語句。
  3. 當解析到***let variable***語句的時候,引擎便會讓變量經過***初始化階段***,變量從未定義變成undefined。
  4. 當解析到***variable = 'value'語句的時候,引擎便會讓變量經過***賦值階段,變量從undefined變成有值。
console.log(num) // => Throws ReferenceError
let num;
console.log(num) // => nudefined
num = 5;
console.log(num) // => 5
複製代碼

constclass類型和let有相同的生命週期,只是const和class只能賦值一次

相關文章
相關標籤/搜索