2011-08-01 13 views
1

なぜそれが、これはエラーを与えることである。Javascriptの未定義配列値

var a = [c]; 
// ERROR: c is not defined 

が、これにはない(ただし、未定義で結果):

var a = [c]; 
var c = 'x'; 
console.log(a); // [undefined] 

jsFiddle

答えて

8

それはhoistingと呼ばれていますそして、あなたのJavascriptエンジンはdeclareすべてvarとなり、function declarationsとなります。 ime。つまり、そのスクリプトが実行されるときに、すべてのvarステートメントが既に宣言されています(しかし定義されていません)。

時々問題になることがあります。例:

var foobar = true; 

function what() { 
    if(foobar) { // should be true, no? 
     alert('foobar is defined'); 
    } 
    else { 
     alert('huh, where is foobar??'); 
     var foobar = true; 
    } 
} 

我々はwhat()を実行した場合、我々はhuh, where is foobar??メッセージが表示されます。これは、実行コンテキストがwhatであるため、インタプリタがコードを読み取ったときに、変数foobarが宣言される(定義されない)ためです。宣言は常にundefinedです。文脈内で文がどこにあるのかは関係ありません!それは常に "吊り上げられる"。

この種のエラーを完全に回避するには、それぞれのコンテキスト/関数の先頭に使用変数のをすべて宣言して定義してください()。

サンプルコードを見ると、何が起こるのか簡単に答えることができます。

var a = [c]; 
var c = 'x'; 
console.log(a); // [undefined] 

とすぐに私たちのJavaScriptインタプリタがそのコードを読み取ると、それは変数acを宣言します。これは、配列にそれを使用しようとすると、変数「C」は存在しません

var a, c; 
a = [c]; 
c = 'x'; 

または、それ以上expresive

var a = undefined, c = undefined; 
a = [c]; // c is undefined 
c = 'x'; // and finally gets defined as 'x', but too late. 
0

のようになります。あなたはそうする必要があり :

var c = 'x'; 
var a = [c]; 
3

巻き上げ:変数が宣言されたかのようにJavaScriptは、彼らがすべての行為のどこかの関数で複数のvarステートメントを持つことができます、そして

散在VARS通報を関数の先頭にある。この動作は ホイストとして知られています。これにより、変数を使用したときに論理エラーが発生し、 関数でそれをさらに宣言することができます。 JavaScriptの場合、変数が同じ スコープ(同じ関数)にある限り、var 宣言の前に使用されていても宣言されていると見なされます。この例を見てみましょう:

// antipattern 
myname = "global"; // global variable 
function func() { 
    alert(myname); // "undefined" 
    var myname = "local"; 
    alert(myname); // "local" 
} 
func(); 

をこの例では、最初にアラートが()「グローバル」プロンプトが表示されますことを期待するかもしれないと 目は地元の「プロンプトが表示されます。 の最初の警告時に、mynameが宣言されておらず、関数がおそらく "参照してください" グローバルなmynameのため、合理的な期待です。しかし、それはどのように動作するのではありません。最初の警告は、 "undefined"と表示されます。 mynameは関数のローカル変数として宣言されているとみなされるためです。 ( 宣言が後にありますが)すべての変数宣言は 関数の先頭に持ち込まれます。したがって、このような混乱を避けるためには、使用するすべての変数 を事前に宣言することをお勧めします。 Stoyan Stefanovの(オライリー)によって

myname = "global"; // global variable 
function func() { 
    var myname; // same as -> var myname = undefined; 
    alert(myname); // "undefined" 
    myname = "local"; 
    alert(myname); // "local" 
} 
func(); 

「JavaScriptのパターン:それはそうように実装されているかのよう 上記のコードスニペットは動作します。 Copyright 2010 Yahoo!、Inc.、9780596806750。 "

関連する問題