20170525-執行環境、做用域鏈、做用域

執行環境

  • 執行環境中定義了變量和函數有權訪問的其餘數據,決定了他們各自的行爲。前端

  • 當JavaScript解釋器初始化執行代碼時,它首先默認進入全局執行環境,今後刻開始,函數的每次調用都會建立一個新的執行環境。數組

  • 每一個函數都有本身的執行環境。當執行流進入一個函數時,函數的環境就會被推入一個環境棧中(execution stack)。在函數執行完後,棧將其環境彈出,把控制權返回給以前的執行環境。ECMAScript程序中的執行流正是由這個便利的機制控制着。函數

  • 執行環境能夠分爲建立、執行、銷燬三個階段。在建立階段,解析器首先會建立一個變量對象(variable object),它由定義在執行環境中的變量、函數聲明、和參數組成。在這個階段,做用域鏈會被初始化,this的值也會被最終肯定。在執行階段,代碼被解釋執行。 某個執行環境中的全部代碼執行完畢後,該環境被銷燬,保存在其中的全部變量和函數定義也隨之銷燬ui

做用域鏈

  • 當代碼在一個執行環境中執行時,會建立變量對象的一個做用域鏈this

  • 做用域鏈的做用是:保證對 當前執行環境權訪問的全部變量和函數的有序訪問url

  • 做用域的前端始終是當前執行的代碼所在環境的變量對象code

  • 做用域鏈的最後始終是全局執行環境的變量對象對象

  • 做用域鏈裏只包含上一級的變量對象,但並不包括下一級的變量對象ip

  • 標識符解析的是沿着做用域鏈一級一級地搜索標識符的過程,搜索始終從做用域鏈的前端開始(當前環境的變量對象),逐級向後查找(上級環境的變量對象),直至找到標識符爲止作用域

  • 內部環境能夠經過做用域鏈訪問全部外部環境,可是外部環境沒法訪問內部環境中的任何變量和函數

  • 延長做用域鏈:

    • 在做用域鏈的前端(本身的變量對象以前)臨時增長一個變量對象,該變量對象會在(這段)代碼執行後被移除

    • try-catch語句中的catch塊

    • with語句:

function builder(){
    var str = "advd"
    // 在做用域鏈的前端臨時增長了一個變量對象,這樣在當前執行環境中就能夠訪問loaction的屬性和方法了
    with(location){
        var url = href + str
    }
    // 當with代碼執行後,做用域鏈中的臨時變量對象被移除,此時沒法訪問href
    console.log(href) //  Uncaught ReferenceError: href is not defined
    return url
}

做用域

  • 我認爲做用域鏈是對變量對象/執行環境而言的,當執行環境中出現一個變量時,應該按照怎樣的搜索方式(沿着做用域鏈)去找到這個變量

  • 做用域是對於變量而言的,指明瞭這個變量在哪些地方能夠被訪問到,例如某一變量處於全局做用域中,則該變量能夠在代碼的任何地方被訪問到

  • 全局做用域:

    • 最外層函數和最外層函數外面定義的變量擁有全局做用域

    • 全部 未定義 (要理解這個未定義的含義) 直接賦值的變量自動聲明爲擁有全局做用域

    • window對象的屬性擁有全局做用域

  • 函數做用域:

    • 在函數中定義的變量

    • 給函數傳遞的參數

相關文章
相關標籤/搜索