作用域是指變量能被訪問到的範圍,而在js中,又被分為全局作用域或局部作用域

全局作用域:在腳本任何地方都可以訪問的作用域

局部作用域:只有在定義的函數才可以訪問的作用域

var scope = "全局"

function a(){
var scope = "局部";
console.log(scope);
}

顧名思義,全域作用域的變量叫做全局變量,而區域作用域的變量叫做區域變量,簡單來說,可以想成

全局變量:在函數之外聲明的變量

區域變量:在函數之內聲明的變量

為了更了解,我們來做一個同名但不同區域的變量看看

var a = 4;

function ez(){
var a = 5;
return a;
}

console.log(a);
console.log(ez());

可以發現,運行之後,第一個console.log()產出的值是4,而第2個console.log()產出的值是5,即便這兩個全局變量跟局部變量是同名的,但他們會被視為不同的變量,也就是說,當作用域是不同的時候,他們會被視為不同的變量


我們有個問題,之前不是說過宣告變量也可以不用加上var,試試看

a = 4;

function ez(){
a = 5;
return a;
}
console.log(a);
console.log(ez());

可以發現,兩個console.log()都產出5,這說明a=4被a=5給覆蓋了,所以,剛剛不是說在函數內宣告變量,叫做局部變量嗎?這就是為何剛剛有說這種說法不太好,那為何局部變量會覆蓋到上方的全域變量呢?

從這次的實驗結果來看,不使用var語句宣告的都是全域變量

所以更好的說法應該是,var語句定義的變量,透過在宣告的位子來決定變量的作用域