JavaScript 核心觀念(6)-執行環境與作用域-範圍鍊
嗨~大家好,我是Kris
今天要來說明
為什麼明明宣告在外層的變數甚至是不同地方的函式,卻可以正確的呼叫與執行。
範圍鍊
函式裡面沒有需要的變數時,就會向外層尋找
變數在外層宣告,但內層卻可以取得
JavaScript是語法作用域,所以並不會與執行堆疊有任何關係。
因此fu1()不會因為他是在fu2()下被呼叫
就去尋找fu2()裡的var value = 2; 而是會去外層尋找外面的var value =1;。
範圍鍊真正的意思是「當函式本身沒有相對應的變數或函式時,就會向外層去尋找」
而這個尋找的過程就是【範圍鍊】,因此這邊與執行堆疊、執行環境不會有任何直接關係。
以下提供幾個範例,大家可以跟著做做看哦
不同情況下分別會列印出什麼呢? 答案放在最下方
2.
解答分隔線
----------------------------------------------------------------------------------------------------------------------------------------------------------------
1. 哈囉~老媽
2. 哈囉~老媽
3. 哈囉~漂亮阿姨
4. 哈囉~老爸
5. 哈囉~老媽
//1.
只執行sayHi(),sayHi()裡沒有person此變數,因此向外層尋找,找到全域變數的'老媽'
其他兩個fn裡的變數皆是區域變數,不影響sayHi()
//2.
doMorningWork()裡的變數為區域變數,不影響sayHi();
*函式沒有被呼叫就不會執行哦,所以meetAuntie()不會執行
//3.
執行meetAuntie()時內部有person,故印出'漂亮阿姨'
不被doMorningWork()的'老爸'影響
//4.
執行meetAuntie()時內部沒有person變數,所以向外層doMorningWork()尋找所以印出'老爸'
//5.
執行meetAuntie()時內部沒有person變數,所以向外層doMorningWork()尋找也找不到時
就會再向外一層尋找,故找到最外層的全域變數,所以印出'老媽'
今天就到這邊告一段落,會持續更新上課筆記,如果有錯誤的地方可以下面留言告訴我。
评论
发表评论