1. ローカル変数は最初に使用されてから宣言され、同じ名前の外部変数には影響しません
var x = 1; // --> 外部変数 x
function fn(){
warning(x); / --> 未定義のローカル変数を最初に使用します
var x = 2 // 次に宣言して割り当てます
}
alert(x); 1
最初の点、関数 fn の最初の文は x を出力し、x は 2 番目の文で定義されます。これは JS では許可されており、ここで許可されているということは、プログラムが構文エラーなしで実行できることを意味します。
ただし、C や Java などの他の言語では許可されません。
コードをコピー など、変数は使用前に宣言する必要があります。 コードは次のとおりです:
public class Test {
public static void main(String[] args) {
System.out.println(x); // 最初に
を使用します int x = 10; // 次に
を宣言します }
}
Java のコンパイラではエラーが表示され、プログラムは実行できません。
2 番目の点は、関数 fn 内のローカル変数 x は外部変数 x に影響を与えません。つまり、fn のアラート出力は 1 ではなく、未定義になります。
2 番目に、仮パラメータは関数名よりも優先されます
function fn(fn){
alert(fn);
}
fn('hello');
関数名と仮パラメータは fn と同じ名前であり、出力は文字列 "hello" ですが、関数本体 (fn.toString()) ではないことがわかります。 ) 関数 fn の。
3 つは、仮パラメータは引数よりも優先されます
関数 fn(引数){
アラート(引数)
}
fn('hello'); // "hello"
arguments オブジェクトは関数内で直接使用でき、言語自体によって提供される特別な識別子です。
ここでは、仮パラメータが同じ名前で宣言されています。出力が「[object Object]」ではなく「hello」であることがわかります。つまり、仮パラメータの引数が、言語自体によって提供される実際の引数をカバーしています。
第 4 に、仮パラメータは、宣言されていても割り当てられていないローカル変数よりも優先されます
コードをコピー コードは次のとおりです。 // - -> "hello"
関数 fn の仮パラメータは a です。関数の最初の文はローカル変数 a を宣言するだけで、値は割り当てられません。出力結果が未定義ではなく「hello」であることから、宣言されただけで値が代入されていないローカル変数 a よりも仮パラメータ a の方が優先度が高いことがわかります。
5. 宣言および割り当てられたローカル変数は仮パラメータよりも優先されます
コードをコピー
関数 fn(a){ var a = 1; アラート(a); // - -> "1" 関数 fn の仮パラメータは a です。関数の最初の文はローカル変数 a を宣言し、それに値 1 を割り当てるだけです。出力結果が「hello」ではなく「1」であることから、宣言して代入したローカル変数 a が仮パラメータ a よりも優先度が高いことがわかります。
6. 仮パラメータが同じ名前のローカル変数に代入されている場合
コード
コードは次のとおりです:
function fn(a){
var a = a;
alter(a); } fn('hello ');
まだ実行しないで、結果を推測してください。ポイント 5 に従う場合: 宣言および割り当てられたローカル変数は、仮パラメータよりも優先されます。その場合、 a は未定義になります。しかし実際には、a は「hello」です。つまり、右側の a は仮パラメータ a、左側の a はローカル変数 a です。
ここでの 2 つの a は互いに干渉せず、どちらも他方を覆い隠しません。これは、先ほど述べたことと矛盾しています。割り当てられたローカル変数は、仮パラメータよりも優先されます。しかし、var a = a の後に a が未定義になることは望ましくないので、エンジンは私たちが望んでいることを実行します。