---
# System prepended metadata

title: '[JS]var、let、const'
tags: [' Javascript', ES6]

---

---
tags: ES6, Javascript
disqus: hackmd
---

# [JS]var、let、const

函式作用域(function scope)，意思就是他的影響力在function裡，出了function就找不到了。

塊級作用域(block scope)，意思就是他的影響力在{}裡，出{}就找不到了。

`var`是函式作用域(function scope)
`let`、`const`是塊級作用域(block scope)

```javascript=
function f1() {
  let n = 5;
  if (true) {
    let n = 10;
  }
  console.log(n);
}

f1() //5

如果把let改成用var

function f1() {
  var n = 5;
  if (true) {
    var n = 10;
  }
  console.log(n);
}

f1() //10
```
由於`var`是函式作用域，所以第二個範例在if內的`n = 10`，導致在後的console.log(n)拿到的是被影響的n

而如果是塊級作用域的`let`，則因為影響力不超出`{}`，導致在if內的`n = 10`，無法影響到外免的console.log(n)

#### const特別的地方
const在宣告之初就必須給值，否則會報錯。
如果是指址，那麼是可以對址裡面做更動的。
![const的指址](https://i.imgur.com/9OMw01T.png)