`function`キーワードで宣言された関数は、**もっとも近い関数またはグローバルスコープの先頭**に配置される。これを[[関数の巻き上げ]]と呼ぶ。
たとえば以下のコードは
```js
hoge();
function hoge() {
// ...
}
```
下記のように暗黙的に巻き上げられる。
```js
function hoge() {
// ...
}
hoge();
```
### constやletを使う場合
巻き上げは発生しないので[[ReferenceError]]になる。
```js
hoge(); // hogeとは??
const hoge = () => {
// ...
}
```
### varを使う場合
[[varの巻き上げ]]が発生するため[[ReferenceError]]にはならない。代わりに`undefined`をcallしようとしてエラーになる。
具体的には
```js
hoge(); // hogeとは??
var hoge = () => {
// ...
}
```
が
```js
var hoge;
hoge(); // undefinedはcallできない
hoge = () => {
// ...
}
```
となる。