承前文,在函式中的結構中,包括變數。使用變數,就須宣告,因此宣告所及的範圍(Scope)成為函式、乃至整個程式能否執行、怎樣執行的要害所在。
耳熟能詳的「區域變數」、「全域變數」,在這裡有其明確範圍。「區域」者,指函式區域之內。「全域」者,指寫在函式之外、影響整個程式範圍的變數。
若函式本身「沒有宣告」變數(區域),就會往函式外找「有宣告」的同一變數(全域)。如:
var rebellionStory = 23
var boxOffice = function (firstTwo){
//內部沒有變數rebellionStory,就會往外找,找到帶參數23的全域變數rebellionStory
//若整個程式都沒有rebellionStory,就會引發錯誤 "rebellionStory is not defined"
return rebellionStory + firstTwo;
};
console.log( boxOffice(12) ); //得出35
此處須留意者,是力場(誤)函式可以「單向」「向外」讀取變數,但外層讀不到函式內的變數。
為什麼?因為QB做了調整(再誤)。
函式裡的變數宣告,只對函式裡有效。在規則中,function{ } 可以關住:var、let、const宣告。而 { } 只能關住:let、const。也就是說:
在以var宣告的情況下,若函式內的變數只有「指派」、沒有「宣告」,會令函式**「向外尋找同名變數」**:
有關引數/參數/回傳值的若干規則,具列如下:
在函式內,若在變數被宣告前就使用(亦即console.log變數先於var變數),程式會在函式範圍內尋找變數。確認其存在後,便不會判定錯誤,而是給出尚未定義(undefined)提示。
詳如Day-02說明
https://ithelp.ithome.com.tw/articles/10264852