3 つの異なる手法が思い浮かびます。それぞれに警告があり、(2 番目のものを除いて) 使用されます。
var
1) 次のキーワードを使用して、コード内の任意の場所で JavaScript の新しい変数を宣言できます。
var $color = 'red';
変数は実際には、ステートメントの上であっても、発生するスコープ全体で定義されます。var
var
function foo() {
doSomething();
var x = 5;
x += doSomethingElse();
return x;
}
function foo() {
var x;
doSomething();
x = 5;
x += doSomethingElse();
return x;
}
これは、すべてvar
の が有効になるのは、関数がコード内に現れる場所ではなく、関数のコンテキストが作成されたときだからです。もっと:悪い、誤解されているvar
2) どこにも宣言されていないフリー シンボルに割り当てるだけの場合は、暗黙的なグローバル変数 (現在のスコープに制約されたものではない) を作成することになりますが、これは一般的には悪い考えです。詳細:暗黙的なグローバルの恐怖
3) 他にできることは、追跡したいさまざまな変数のコンテナであるオブジェクトを用意することです。それらを割り当てるだけで、オブジェクトに新しいプロパティを作成できます。
var data = {}; // A blank object
data.foo = "bar"; // Now `data` has a `foo` property
この手法は、たとえばユーザー入力に基づいて、スクリプトが完全に認識していないデータを追跡する必要がある場合に特に便利です。これは、上記のようにドット表記とリテラル ( data.foo
) を使用するか、括弧付き表記と文字列を使用できるためです。 ( data["foo"]
)。後者の場合、文字列は任意の式の結果になる可能性があるため、これらはすべて のfoo
プロパティを作成しdata
ます。
// Dotted notation with a literal
data.foo = 42;
// Bracketed notation with a literal string
data["foo"] = 42;
// Bracketed notation with a string coming from a variable
s = "foo";
data[s] = 42;
// Bracketed notation with a string coming from an expression
s = "o";
data["f" + s + s] = 42;