JAVACSCRIPT関数の役割ドメインと事前宣言の共有

1655 ワード

C、javaなどの言語にはブロックレベルの役割ドメインがあります.すなわち、カッコ内の各セグメントのコードにはそれぞれの役割ドメインがあり、変数は宣言されたコードセグメント以外では表示されませんが、javascriptにはブロックレベルの役割ドメインはありません.JAvascriptは、関数の役割ドメインを使用します.すなわち、変数は、それらを宣言する関数体およびこの関数体がネストされている任意の関数体内で定義されています.すなわち、関数内で宣言されたすべての変数は、関数体内で常に表示されます.これは、javascript関数で宣言されたすべての変数が関数の上部に繰り上げられる「宣言リード」と呼ばれる変数が宣言前に使用できることを意味します.例を見てみましょう.
 
  
  var test1 = "globalVariable";
  function test(){
    console.log(test1);  
    var test1 = "localVariable";
    console.log(test1);
  }

上記の関数を実行した結果、「undefined」を出力してから「localVariable」を出力します.
「globalVariable」を先に出力し、localVariableを出力すると勘違いする人が多いようです.実はそうではありません.関数の役割ドメインの特性のため、局所変数は関数体全体で常に定義されています.つまり、関数内の局所変数は同名のグローバル変数を隠していますが、プログラムがvar文を実行したときにのみ、局所変数は真の値に割り当てられます.したがって、上記の手順は、関数内の変数宣言を関数体の上部に繰り上げ、変数初期化が元の位置に残ることに相当する.次のような関数に相当します
 
  
  var test1 = "globalVariable";
  function test(){
    var test1;  //
    console.log(test1);  
    test1 = "localVariable";  //
    console.log(test1);
  }

しかし、関数内にvarで変数を宣言していない場合は、状況が異なります.
 
  
  var test1 = "globalVariable";
  function test(){
    console.log(test1);  
    test1 = "localVariable";  
    console.log(test1);  
  }

この関数を実行した結果、「globalVariable」を出力してから「localVariable」を出力します.
関数内のtest 1変数はvarで宣言されていないため、デフォルトはグローバル変数であり、もちろん変数が事前に宣言される問題はありません.1行目は「globalVariable」を出力し、3行目はtest 1グローバル変数の値を変更して「localVariable」を出力します.