C や Java などの一部の言語にはブロック レベルのスコープがあります。つまり、中括弧内のコードの各部分には独自のスコープがあり、変数は宣言されているコード セグメントの外には表示されませんが、JavaScript にはブロックがありません。 -レベルのスコープ。 JavaScript は関数スコープを使用します。つまり、変数は宣言されている関数本体と、この関数本体がネストされている関数本体で定義されます。つまり、関数内で宣言されたすべての変数は常に関数本体で表示されます。これは、変数が宣言される前に使用できることを意味します。この機能は「宣言先行」と呼ばれます。つまり、JavaScript 関数で宣言されたすべての変数が関数の先頭に先行されます。例を見てみましょう。
var test1 = "globalVariable";
function test(){
console.log(test1);
var test1 = "localVariable";
console.log(test1);
}
上記の関数を実行すると、結果は、最初に「unknown」が出力され、次に「localVariable」が出力されます。
多くの人は、結果が「最初に globalVariable、次に localVariable」を出力すると誤解しています。実際には、そうではありません。関数スコープの特性により、ローカル変数は常に関数本体全体で定義されます。つまり、関数本体内のローカル変数が同じ名前のグローバル変数をカバーするのは、プログラムが var ステートメントを実行すると、ローカル変数が実際に割り当てられます。したがって、上記の処理は、変数の初期化を元の位置に残したまま、関数内の変数宣言を関数本体の先頭まで進めることと同じです。次の関数と同等です
var test1 = "globalVariable" ;
Function test(){
var test1; // 関数内の変数宣言を関数の先頭に進めます
console.log(test1); localVariable"; // Assignment
console.log(test1);
}
ただし、関数内で変数がvarで宣言されていない場合は状況が異なります。
var test1 = "globalVariable";
function test(){
console.log(test1);
test1 = "localVariable";
}
結果この関数を実行するかどうか はい: 最初に「globalVariable」を出力し、次に「localVariable」を出力します。
関数本体のtest1変数はvarで宣言されていないので、デフォルトでグローバル変数になりますが、変数の早期宣言は問題ありません。 1行目は「globalVariable」を出力し、3行目はtest1グローバル変数の値を変更して「localVariable」を出力します。