iT邦幫忙

2021 iThome 鐵人賽

DAY 12
0
自我挑戰組

追憶JS年華系列 第 12

Day-12 函式與變數

承前文,在函式中的結構中,包括變數。使用變數,就須宣告,因此宣告所及的範圍(Scope)成為函式、乃至整個程式能否執行、怎樣執行的要害所在。

變數的範圍

耳熟能詳的「區域變數」、「全域變數」,在這裡有其明確範圍。「區域」者,指函式區域之內。「全域」者,指寫在函式之外、影響整個程式範圍的變數。

若函式本身「沒有宣告」變數(區域),就會往函式外找「有宣告」的同一變數(全域)。如:

var rebellionStory = 23

var boxOffice = function (firstTwo){
    //內部沒有變數rebellionStory,就會往外找,找到帶參數23的全域變數rebellionStory
    //若整個程式都沒有rebellionStory,就會引發錯誤 "rebellionStory is not defined"
    return rebellionStory + firstTwo;
};

console.log( boxOffice(12) ); //得出35

此處須留意者,是力場(誤)函式可以「單向」「向外」讀取變數,但外層讀不到函式內的變數。
https://ithelp.ithome.com.tw/upload/images/20211011/20141041ddLQx6R8nJ.jpg

為什麼?因為QB做了調整(再誤)。
https://ithelp.ithome.com.tw/upload/images/20211011/20141041tqMsS57YcE.png

函式裡的變數宣告,只對函式裡有效。在規則中,function{ } 可以關住:var、let、const宣告。而 { } 只能關住:let、const。也就是說:

  • for(var…){} 的宣告效力會溢出到外面。
  • for(let…){} 因為有{}所以會鎖在 scope 裡。

在以var宣告的情況下,若函式內的變數只有「指派」、沒有「宣告」,會令函式**「向外尋找同名變數」**:

  • 若找到,會改變/污染它,讓他變成自己(該函式)的值
  • 若沒有,會直接「假設」一個「全域變數」。

有關引數/參數/回傳值的若干規則,具列如下:

  • function內的值也需要宣告,不然會變成全域變數(全域物件)
  • 引數帶入參數(parameter),成為變數(argument)。
  • JS參數引數可以不同
    • 引數 < 參數:沒給引數的參數,為 undefined。
    • 引數 > 參數:多餘的引數無用,不會印出。
  • 所有的function都有回傳值,undefined也算是一種,沒有回傳值 = 甚麼都看不到
  • return會做兩件事:
    • 把控制權轉移到剛剛呼叫函式的地方
    • 把值傳回去

變數的提昇

在函式內,若在變數被宣告前就使用(亦即console.log變數先於var變數),程式會在函式範圍內尋找變數。確認其存在後,便不會判定錯誤,而是給出尚未定義(undefined)提示。

詳如Day-02說明
https://ithelp.ithome.com.tw/articles/10264852


上一篇
Day-11 函式入門
下一篇
Day-13 觀念補遺:TDZ與全域變數
系列文
追憶JS年華30

尚未有邦友留言

立即登入留言