変数はスコープのどこで宣言したとしても、先頭で宣言した(宣言済み)とみなされる
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); }