JavaScript 核心觀念(6)-執行環境與作用域-範圍鍊


嗨~大家好,我是Kris

今天要來說明

為什麼明明宣告在外層的變數甚至是不同地方的函式,卻可以正確的呼叫與執行。


範圍鍊

函式裡面沒有需要的變數時,就會向外層尋找
變數在外層宣告,但內層卻可以取得
























JavaScript是語法作用域,所以並不會與執行堆疊有任何關係。
因此fu1()不會因為他是在fu2()下被呼叫
就去尋找fu2()裡的var value = 2;     而是會去外層尋找外面的var value =1;。


範圍鍊真正的意思是「當函式本身沒有相對應的變數或函式時,就會向外層去尋找」
而這個尋找的過程就是【範圍鍊】,因此這邊與執行堆疊、執行環境不會有任何直接關係。


JavaScript 因為是語法作用域的關係,在程式碼撰寫完畢時,就已經決定了作


用域。



以下提供幾個範例,大家可以跟著做做看哦
不同情況下分別會列印出什麼呢? 答案放在最下方


1.

2.

3.



4.

5.























解答分隔線

----------------------------------------------------------------------------------------------------------------------------------------------------------------





























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()尋找也找不到時
就會再向外一層尋找,故找到最外層的全域變數,所以印出'老媽'




今天就到這邊告一段落,會持續更新上課筆記,如果有錯誤的地方可以下面留言告訴我。

『阻止我們再往前一步的,其實不是任何事情,往往都是我們自己』




评论

此博客中的热门博文

JavaScript 核心觀念(5)-執行環境(Execution context)與執行堆疊(Execution stack)

JavaScript 核心觀念(3)-的語法作用域(Lexical scope)