変数はスコープのどこで宣言したとしても、先頭で宣言した(宣言済み)とみなされる

JavaScriptでは、ある変数はそれが同じスコープ(同じ関数)の中にある限り、たとえvar宣言より前にその変数が使われていたとしても、その変数は宣言済みとみなされる。
変数が宣言済みということは、変数が宣言され、undefinedで初期化されているということである。

例えば、下記のコードは有効である。

function func(){
 alert(name);
 var name = "local";
 alert(name);
}

Javaではnameが宣言される前に使用されると、コンパイルエラーとなる。つまり、下記のようなコードはJavaでは許されない。

public static void main(String[] args) {
 //nameが宣言される前に使用されているのでコンパイルエラー
 System.out.println(name);
 String name ="test";
 System.out.println(name);
}

しかし、JavaScriptにおいて、スコープのどこで宣言したとしても先頭で宣言したとみなされることは、スコープのどこで初期化したとしても先頭で初期化したとみなされる、という意味ではない。

最初に紹介したJavaScriptコードは、下記と同じである。
変数の宣言と初期化をスコープの途中で行った場合、冒頭で変数がundefinedで初期化され、何らかの値が代入されるまではundefinedである。

function func(){
 var name; //undefinedで初期化される
 alert(name);
 name = "local";
 alert(name);
}