`var`による変数宣言は宣言と代入の2つから構成される。
```js
var x = 10;
// は
var x; // 宣言
x = 10; // 代入
// から構成される
```
このとき、**宣言はもっとも近い関数またはグローバルスコープの先頭**に配置される。これを[[varの巻き上げ]]と呼ぶ。
たとえば以下のコードは
```js
console.log(x)
console.log("hoge")
var x = 10;
```
下記のように暗黙的に巻き上げられる。
```js
var x;
console.log(x)
console.log("hoge")
x = 10;
```
先ほどの説明に存在しなかったブロックスコープは[[varの巻き上げ]]で考慮されない。
つまり以下のコードは
```js
function hoge() {
console.log(x)
{
console.log("hoge")
var x = 10;
}
}
```
下記のように暗黙的に巻き上げられる。
```js
function hoge() {
var x;
console.log(x)
{
// ブロックスコープの先頭であるここに var x; はこない..!!
console.log("hoge")
x = 10;
}
}
```