在js中,有着一種被稱為作用域(scope)的特性。
那麼什麼是作用域呢?
作用域是在運作時代碼中的某些特定部分中變量,函數和對象的可通路性,即作用域控制着變量與函數的可見性和生命周期。簡單來講,就是變量和函數生效的“範圍”。而作用域又分為全局作用域和局部作用域。
什麼叫全局作用域?
任何地方都能通路到的對象擁有全局作用域。在函數外面定義的變量就屬于全局變量,擁有全局作用域。沒有定義,卻直接指派的變量也屬于全局變量,即擁有全局作用域。此外,windom的屬性也擁有全局作用域。
例:

在script中我們定義了一個全局變量a,并将a在函數fun調用時列印出來。給未定義的變量b進行指派,并在調用完函數fun後列印。效果如下:
控制台顯示的一個數為10,即fun函數列印出的函數。第二個數為20,則是我們在fun函數裡面未定義直接指派的變量。兩個數都能正确的列印出來,說明全局函數在任何地方都能通路到。
什麼叫局部作用域?
局部作用域一般隻在固定的代碼片段内可通路到,最常見的例如函數内部,是以在一些地方會把這種作用域成為函數作用域。局部作用域的資料的生命周期在該函數執行完以後就被釋放。
例:
在該代碼片段我們在fun函數裡定義了一個變量a并為其指派,然後調用fun函數,并且在調用完函數後再次列印a。就産生如下效果。
如下:
在控制台,正确的輸出了一個10.這個10 是調用函數fun 列印的a,但是在調用完fun函數後,當我們在列印a就報出一個錯誤。這個錯誤時顯示a是一個沒有定義的便量。
這兩個不同結果說明了a在函數fun調用完畢就被釋放。是以我們再想列印出a就報出未定義的出錯。而在函數fun裡面聲明的a就是一個局部變量,他的生命周期就隻有函數fun執行的這一段時間。