變數使用 var 宣告在函式外的,就是全域變數,然後瀏覽器內建有個全域物件 window,也可印出來觀察,例:
var a =10; // a 是全域變數functionadd_number(){ a = a +10; // 這裡的 a 取用到了全域變數}add_number();console.log(a); // 20console.log(window); // 瀏覽器內建的全域物件 windowconsole.log(window.a); // 20
範例 3:區域變數
變數宣告在函式內的,就是區域變數,然後在函式內皆可取用(即函式範疇),例:
var a =10; // a 是全域變數functionadd_number(){var x =5; // x 是函式內的區域變數,可在函式內取用console.log(a + x); // 15}add_number();console.log(a); // 10console.log(x); // 在 console 中出現了 error,因為 x 變數未定義
範例 4:參數是屬區域變數
建議名稱不要相同,以免混洧,例:
var a =10;functionadd_number(a){ // 這裡的 a 是函式內的區域變數 a = a +10;console.log("函式內 "+ a); // 函式內 20}add_number(a);console.log("函式外 "+ a); // 函式外 10
儘量避免變數名稱一樣,以免混洧。
範例 5:let 與 const 屬區塊範疇
執行以下兩段程式並比較看看:
情況 1:
var a =1;if(a ==1){var b =2;}console.log(a+b); // 3
情況 2:
var a =1;if(a ==1){let b =2;}console.log(a+b); // console 會出現錯誤訊息
結論:
var 宣告的變數,其實是屬於函式範疇,所以上述情況 1,b 在 if 外的程式也可以取用得到。(這也跟拉升(Hoisting)關念有關。)
let 宣告的變數,是屬於區塊範疇,也就是情況 2 用大括號包住的那個區域,即 b 變數只存在於大括號中。
再執行以下程式看看:
functiontest_func(){var a =1; // var 宣告在函式內,故 a 範疇存在於函式中}console.log(a); // console 會出現錯誤訊息