js変数のスコープとアクセス可能性の検討

7590 ワード

各言語には変数の概念があり、変数は情報を格納するための要素です.例えば以下の関数: 

    function Student(name,age,from)  
  

 this.name = name; 
  this.age = age; 
 this.from = from; 
  this.ToString = function() 
 { 
  return "my information is name: "+this.name+",age : "+this.age+", from :" +this.from; 
  } 
}
 
   Student類には三つの変数があり、それぞれname(名前)、age(年齢)、from(出身地)であり、この三つの変数は一つの対象を記述する情報を構成している.もちろん、ここでStudentの情報を返す方法があります.
   しかし、私達は変数を定義していますか?それはずっと存在しています.そしてどこでもアクセスできて、廃棄されるまで使用できます.よく考えてみると、上の需要はあまりにもひどいです.ある変数は機能が実現した後、もう利用しなくなりましたが、もしこの変数がまだ存在するなら、システム資源を占有します.俗語では「マオの穴に立って引っ張らない」と言います.
   そこで私たちは変数に対して適時に廃棄し、需要に応じて検討している話題があります.
   はい、本題に入りましょう.本人が接触した場合、jsでは以下のような変数がサポートされています.それぞれ、局所変数、クラス変数、私有変数、インスタンス変数、静的変数、大域変数です.これからは一つ一つ検討してみます.
ローカル変数:
ローカル変数とは、一般的に、{}の範囲内で有効な変数、つまりステートメントブロック内で有効な変数を指します. 
 

   function foo(flag)  
  

 var sum = 0; 
 if(flag == true) 
 { 
  var index; 
  for(index=0;index<10;index++) 
  { 
   sum +=index; 
  } 

 document.write("index is :"+index+"
"); 
 return sum; 

//document.write("sum is :" +sum+"
"); 
document.write("result is :"+foo(true)+"
"); 
   このコードが実行された後に出力された結果は、「index」です. is :undefined」 和 「レスリング is :0」出力したいindex変数の値はundefined、つまり未定義であることが分かります.したがって、index変数はif文ブロックの終了後に破壊されることがわかった.「sum」変数は?この変数はfoo()関数のセクションで実行された後に破棄されました.コメントを削除して実行すると、システムがエラーを起こすことが分かります.注意すべきなのは、上のfoo関数を以下のように変更したらいいです. 
 

   function foo(flag)  
  
 { 
  var sum = 0; 
  for(var index=0;index<10;index++) 
  { 
   sum +=index; 
  } 
  document.write("index is :"+index+"
"); 
  return sum; 
   index値を出力することができます. is :10")これはjsと他の言語の違いです.indexはfor循環の{}の外で定義されていますので、その作用範囲はfoo関数の使用が終わってから廃棄されます.
  クラス変数:
   クラス変数とは、実際には、クラスの属性またはフィールドまたは方法のことであり、この変数は、クラスのインスタンスオブジェクトが破壊された後に自動的に破壊され、例えば、私たちが開始する時に提示したStudentクラスのようなものです.これはあまり議論しないので、自分で試してみてもいいです.
プライベート変数:
   プライベート変数は、あるクラスが自分の内部で使用する属性であり、外部では起動できません. var と宣言しました.注意varを使わないと を選択して宣言します.この変数はグローバル変数になります. 

   function Student(name,age,from)  
  


 this.name = FormatIt(name); 
 this.age = age; 
this.from = from; 
 var origName = name; 
 var FormatIt = function(name) 
 { 
 return name.substr(0,5); 
 } 
 this.ToString = function() 
 { 
  return "my information is name: "+origName+",age : "+this.age+", from :" +this.from; 
 } 
   ここでは、1つのorigNameとFormatIt()の2つのプライベート変数をそれぞれ定義しています.
   この場合の方法も変数になります.この場合の変数はfunction型の変数で、functionもObject類の継承クラスに属します.この場合、私達が定義したら var zfp = new Student(「3 zfp」、100,「ShenZhen」).この二つの変数は、zfp.origNameとzfp.FormatIt()方式ではアクセスできません.
以下の点に注意してください.
1、プライベート変数はthisでは指示できません.
2、プライベートメソッドタイプの変数の呼び出しは、この方法が宣言された後でなければならない.もしStudent類を以下のように改造したら、

   function Student(name,age,from)  
  

 var origName = name; 
 this.name = FormatName(name); 
 this.age = age; 
 this.from = from; 
 var FormatName = function(name) 
 { 
  return name+".china"; 
 } 
 this.ToString = function() 
 { 
  return "my information is name: "+origName+",age : "+this.age+", from :" +this.from; 
 } 

var zfp = new Student("3zfp",100,"ShenZhen"); 
コードを実行すると、「対象が見つからない」というエラーが発生します.FormatName()が定義されていないという意味です.
3、プライベートメソッドはthisが示す変数(公開変数)にアクセスできません.

   function Student(basicinfo)  
  

 this.basicInfo = basicinfo; 

 var FormatInfo = function() 
 { 
  this.basicInfo.name = this.basicInfo.name+".china"; 
 } 
 FormatInfo(); 

function BasicInfo(name,age,from) 

 this.name = name; 
 this.age = age; 
 this.from = from; 

var zfp = new Student(new BasicInfo("3zfp",100,"ShenZhen")); 
がコードを実行すると、システムはヒントを与えます. 「this.baic Infoが空か対象でないか」のエラーです.
基本的な結論は、プライベート方法はプライベート属性にしかアクセスできません.
インスタンス変数:
インスタンス変数とは、あるインスタンスオブジェクトが持つ変数です.例えば:

   function BasicInfo(name,age,from)  
  

 this.name = name; 
 this.age = age; 
 this.from = from; 

var basicA = new BasicInfo("3zfp",100,"ShenZhen"); 
basicA.generalInfo = "is 3zfp owned object"; 
document.write("basicA's generalInfo is : "+ basicA.generalInfo+"
"); 
var basicB = new BasicInfo("zfp",100,"ShenZhen"); 
document.write("basicB's generalInfo is : "+ basicB.generalInfo+"
"); 
, : 
basicA's generalInfo is : is 3zfp owned object 
basicB's generalInfo is : undefined 
静的変数:
静的変数とは、クラスが持つ属性です. クラス名+「.」+静的変数名 のように属性にアクセスします.次のようにはっきりと説明できます.

   function BasicInfo(name,age,from)  
  

 this.name = name; 
 this.age = age; 
 this.from = from; 

BasicInfo.generalInfo = "is 3zfp owned object"; 
var basic = new BasicInfo("zfp",100,"ShenZhen"); 
document.write(basic.generalInfo+"
"); 
document.write(BasicInfo.generalInfo+"
"); 
BasicInfo.generalInfo = "info is changed"; 
document.write(BasicInfo.generalInfo+"
"); 
以上のコードを実行すると、次のような結果が得られます.
undefined
is 3 zfp owned object
info is changed
以下の点に注意してください.
1,以 クラス名+「.」+静的変数名 の方法で静的変数を宣言します.
2、静的変数はクラスのあるインスタンスオブジェクトに固有の属性ではなく、オブジェクトの共有です.
3、インスタンスオブジェクト名+「.」+静的変数で名来にアクセスできます.
グローバル変数:
グローバル変数とは、システム全体の動作中にコントロールに有効にアクセスする変数で、通常はjsコードの先頭に定義されます.

   var copyright = "3zfp owned";  
  
var foo =function() 

 window.alert(copyright); 
は以下の点に注意します.
1、一つの変数がvarを使わない場合 を選択して宣言すると、グローバル変数と見なされます.例えば:
var copyright = 「3 zfp owned';
var foo =function(fooInfo)
{
 _foo = fooInfo;
document.write(copyright+「」);
)
new foo(foo) test");
document.write(_foo+「」);
コードを実行すると、次のような結果が得られます.
3 zfp owned
foo test
しかし、これはもう一つの注意点があります.functionはコンパイルの対象です.つまり、_fooというグローバル変数は、fooオブジェクトが実装された後に初期化されます.つまり、
new foo()
document.write(_foo+「」);
折れ合う
document.write(_foo+「」);
new foo()
システムはヒントを与えます 「ウfoo」 定義されていません. 
2、グローバル変数と同名のローカル変数属性を定義した場合、次のようになります.

   var copyright = "3zfp owned";  
  
var foo =function(fooInfo) 

 var copyright = fooInfo; //  
 this.showInfo = function() 
 { 
 document.write(copyright+"
"); 
 } 

new foo("foo test").showInfo(); 
document.write(copyright+"
"); 
でコードを実行すると、次のような結果が得られます.
3 zfp owned
foo test
理由はパフュージョンです. コンパイル中に変数の定義を完了するということです.つまり、foo内部のcopyrightの定義はコンパイル中に完了しました.その作用領域はfooオブジェクト内でのみ有効です.外部定義のグローバル変数copyrightには関係ありません.