JavaScript 作用域鏈(Scope Chain)是一個執行上下文(Execution Context)的屬性,它用于解析變量和函數聲明。作用域鏈的主要作用是在一個函數內部查找變量時,能夠按照一定的順序查找變量所在的范圍。這個順序是從當前執行上下文的作用域鏈的頂部開始,然后逐層向下查找,直到找到變量或者到達全局作用域。
作用域鏈能進行以下操作:
變量查找:當在函數內部需要查找一個變量時,JavaScript 引擎會首先在當前作用域(Local Scope)中查找該變量。如果在當前作用域中找不到該變量,引擎會繼續沿著作用域鏈向上查找,直到找到該變量或者到達全局作用域。
變量聲明提升:在 JavaScript 中,變量和函數聲明會在代碼執行之前被提升到它們所在作用域的頂部。這意味著在函數內部,你可以在聲明之前引用變量,因為 JavaScript 引擎在執行到聲明時已經將其提升到了作用域鏈的頂部。需要注意的是,只有聲明本身會被提升,而賦值操作不會。
詞法作用域:JavaScript 采用詞法作用域(Lexical Scope),也稱為靜態作用域。這意味著變量的作用域是在代碼編寫時就確定的,而不是在運行時動態決定的。詞法作用域通過作用域鏈來實現,使得變量可以在其聲明之前被訪問,但前提是它們必須在聲明的作用域內。
閉包:閉包是指一個函數可以訪問其外部作用域中的變量。這是通過作用域鏈實現的,當內部函數在外部函數的作用域之外被調用時,它仍然可以訪問外部函數的變量,這些變量會被添加到內部函數的作用域鏈中。
總之,JavaScript 作用域鏈的主要作用是提供變量查找的機制,它通過詞法作用域和閉包等特性,使得變量可以在其聲明之前被訪問,并支持函數之間的封裝和信息共享。