每個代碼被調用時,都會產生一個上下文。這裏代碼分爲全局代碼和函數代碼。windows
全局代碼只有一個,會產生全局執行上下文,函數代碼能夠有不少,每個都會產生一個本身的函數執行上下文。函數
全局執行上下文至關於windows對象,全部的代碼都處於全局執行上下文裏。spa
函數執行上下文是函數內部的空間。那麼就會有疑問,那爲何函數f()裏是全局執行上下文呢?code
每個函數(例如f)執行上下文由兩部分組成:
f內部定義的變量,arguments,內部定義的函數
函數f的父級函數的執行上下文
父級函數:在定義f時,把直接f包起來的那個函數。若是f外層沒有函數,則父級函數就理解全局代碼。
複製代碼
當有函數嵌套時,就會造成函數執行上下文棧,這個棧的原則是後入先出,最裏層的函數先出棧,裏層棧能夠調用外層棧的數據。cdn
執行上下文中保存數據,由兩部分組成,1是本身定義的變量,2是父級函數的執行上下文。
對於全局代碼來講,就只有第一部分:本身定義的變量,也就是全局變量。
執行上下文去調用數據,先在本身定義的變量中找,找不到,就去父級函數的執行上下文去找,若是還找不到,會報錯。
複製代碼
照此理解,爲何函數內部的變量函數外面不能調用呢?對象
那是由於函數內部的變量屬於函數執行上下文。
當全局執行上下文尋找這個變量時,它只會在本身的執行上下文裏去尋找,並不能去函數執行上下文中找,一樣的,外層函數執行上下文也不能去內層函數執行上下文裏尋找數據。複製代碼