---
# System prepended metadata

title: 【Day13】範圍scope
tags: [JavaScript, 14th鐵人賽]

---

# 【Day13】範圍scope
###### tags: `JavaScript` `14th鐵人賽`
在介紹變數時有提到函式內作用、區域內作用，也就是本篇文會介紹的內容：

- 區域變數、全域變數介紹、差別
- 範例
---

## 範圍

JavaScript中變數作用的範圍分為區域變數、全域變數，而**影響變數有效範圍的最小單位是function。**

以簡易的敘述來介紹範圍：

小狗想要在學校圖書館找到一本論文

順利訪問：在圖書館內詢問服務台，此時書的位置是在作用範圍內

不順利訪問：在走廊詢問路人：我想要的書XXX在哪邊呢？此時需要的信息與索取訊息的位置不同，路人表示問號(??

## 兩者差別

- 區域變數：在function中宣告的變數，只能提供所屬函式內使用，無法在函式外呼叫
- 全域變數：不在特定範疇內，可在程序任何位置被訪問

```jsx
let count = 0; //宣告記錄用

function test(){ // 
	count++; //在函式中使用count，而函式中無count的值，因此向外尋找
}

test(); // 找到test的程式碼並執行

console.log(`紀錄${count}次`)

```

在這個範例中可以發現function可以讀取外層已宣告的變數，當此函式外層找不到時，會再往下一層外層尋找，若仍找不到則會出現錯誤訊息。

## 多層的變數宣告

```jsx
let a = 1; // 於最外層的變數宣告

function x() { 
  let b = 2; 
	console.log(b);
  function y() {
    let c = 3; 
		console.log(c);
    function z() {
      let d = 4; 
			console.log(d);
			console.log(c);
    }
    z();
  }
  y();
}
x();
console.log(a); // 1
console.log(b); // b is not defined
console.log(c); // c is not defined
console.log(d); // d is not defined
```

在這個範例中只有a是全域變數，因**外層無法取得內層宣告的變數**，因此我們無法在函式外訪問b、c、d的變數

此外也可以看到在y( )、z( )中皆可訪問變數c的值

以上為本次範圍的介紹，若有問題歡迎指教!