なぜそれが、これはエラーを与えることである。Javascriptの未定義配列値
var a = [c];
// ERROR: c is not defined
が、これにはない(ただし、未定義で結果):
var a = [c];
var c = 'x';
console.log(a); // [undefined]
なぜそれが、これはエラーを与えることである。Javascriptの未定義配列値
var a = [c];
// ERROR: c is not defined
が、これにはない(ただし、未定義で結果):
var a = [c];
var c = 'x';
console.log(a); // [undefined]
それは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インタプリタがそのコードを読み取ると、それは変数a
とc
を宣言します。これは、配列にそれを使用しようとすると、変数「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.
のようになります。あなたはそうする必要があり :
var c = 'x';
var a = [c];
巻き上げ:変数が宣言されたかのように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。 "