---
# System prepended metadata

title: 1-2變數的語法作用域
tags: [JavaScript知識點/面試, 變數與作用域]

---

>宣告的變數會被限制其作用域，作用域會因宣告的語法 var , let , const 的不同而有所變化
# var為涵式作用域
var所涵式內宣告的變數作用域是限制在涵式內，反之在外面宣告的話，就會變成「全域變數」。
```
function fn () {
    var a = '小明'
    console.log(a); // 小明

}
fn()
console.log(a); a is not defined
```
JavaScript中，特別機制稱為「語法作用域」(Lexical scope)，又稱為「靜態作用域」，意旨原始碼在經過直譯器執行後，就已經確定作用域，並不再改變。


---

## 3.核心實戰題-var宣告的變數作用域範圍為和?

```
function fn () {
    var a = '小明'
    console.log(a); // 小明

}
fn()
console.log(a); a is not defined
```
透過「向外查找」的機制，尋找其外層的涵式、作用域是否有該名稱的變數。
如果最外層的全域都沒有該變數名稱，才會跳出「xxx is not defined」的錯誤提示。
```
var a = '小明'
function fn () {
    console.log(a); // 小明
}
fn()
console.log(a); 小明
```
---

### 重點
> * 變數是採語法作用域，程式碼寫完就確認作用域了。
> * 如果涵式內沒有此變數，會採用「向外查找」機制，一直查找到最外層的全域變數。

---

## 4.核心實戰題-let、const宣告的變數作用域範圍為和?
ES6主流，採用let、const宣告變數
* let 【區塊作用域】
    可重新賦值
* const 【區塊作用域】
    常數無法重新賦值
    
何謂「區塊」呢?基本上只要看到 { } 都可認定為區塊。例如:
1. 涵式定義時的 function() { }，其中{}可認定為一個區塊。
2. if、for迴圈都會使用{}，皆屬於區塊作用域的語法

實戰常用的區塊作用域:
* **涵式**:function(){...}
* **for迴圈**:for(let i=0; i<10; i++){...}
* **判斷式**:if(expression){...}
* **純粹的區塊**:{ }

for迴圈結束後，let所宣告的變數則會釋放，因此無法取得該變數
在這類型的陳述式中(if、for...)，小括號內的let作用域等同於其後方的大括號。
```
for(let i=0; i<10; i++){}
console.log(i); // 10

for(let j=0; j<10; j++){}
console.log(j) // j is not defined
```

---
### 重點
> var 屬於函式作用域(function scope)
> let、const 屬於區塊作用域(block scope)

## 下一站 [1-3提升](https://hackmd.io/@KFqiBO5dTA2-3EAj3rqZQg/HkEa39is3)