`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 = () => { // ... } ``` となる。