亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

js變量作用域及可訪問性的探討

 更新時間:2006年11月23日 00:00:00   作者:  
每一種語言都有變量的概念,變量是用來存儲信息的一個元素。比如下面這個函數(shù): 

復制代碼 代碼如下:
 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(籍貫),這三個變量構(gòu)成了描述一個對象的信息。當然,這里還有一個方法用來返回Student的信息。
   但是,我們是不是定義了一個變量,它就能一直存在著,并且還有可能在任何地方都能被訪問和使用直到其被銷毀?仔細想想,上面的需求是比較過分的,因為某些變量在某個功能實現(xiàn)后就不再利用了,但如果這個變量還存在的話,就占用了系統(tǒng)資源了,俗語曰:“站著茅坑不拉#$%”。
   于是我們對變量的及時和按需求地銷毀有一個探討的話題了。
   好,切入正題吧,就本人所接觸過的來講,js中支持如下幾種類型的變量,分別為:局部變量、類變量、私有變量、實例變量、靜態(tài)變量和全局變量。接下來我們就一一探討研究下。

局部變量:

局部變量一般指在{}范圍內(nèi)有效變量,也就是語句塊內(nèi)有效的變量,如: 

 
復制代碼 代碼如下:
function foo(flag) 

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

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

//document.write("sum is :" +sum+"<br>"); 
document.write("result is :"+foo(true)+"<br>"); 
   該代碼執(zhí)行后輸出的結(jié)果為:“index is :undefined” 和 “result is :0”,我們可以看到希望輸出的index變量的值為undefined,也就是未定義。因此我們可以發(fā)現(xiàn),index變量在if語句塊結(jié)束后即被銷毀了。那么“sum”變量呢?這個變量在foo()函數(shù)段執(zhí)行完畢后被銷毀了,如果您去掉我注釋的那條語句,再執(zhí)行,您將會發(fā)現(xiàn)系統(tǒng)將報錯。值得注意的是,如果我把上面的foo()函數(shù)改成如下: 

 
復制代碼 代碼如下:
function foo(flag) 
 { 
  var sum = 0; 
  for(var index=0;index<10;index++) 
  { 
   sum +=index; 
  } 
  document.write("index is :"+index+"<br>"); 
  return sum; 

   您將可以看見可以輸出index值("index is :10"),這個是js和其他語言的不同地方,因為index是在for循環(huán)的{}外面定義的,因此其作用范圍在foo()函數(shù)使用完畢后才銷毀。

  類變量:
   類變量,實際上就是類的一個屬性或字段或一個方法,該變量在該類的一個實例對象被銷毀后自動銷毀,比如我們開始時舉的Student類。這個我們不多討論,大家可以自己試一下。

私有變量:
   私有變量,值得是某個類自己內(nèi)部是用的一個屬性,外部無法調(diào)用,其定義是用 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; 
 } 

   這里,我們分別定義了一個origName和FormatIt()兩個私有變量(按面向?qū)ο蟮慕忉?,應該用類的屬性來稱呼)。
   我們把這種情況下的方法也成為變量,因為該情況下的變量是個function類型的變量,而function也屬于Object類的繼承類。在這種情形下,如果我們定義了 var zfp = new Student("3zfp",100,"ShenZhen")。但無法通過zfp.origName和zfp.FormatIt()方式來訪問這兩個變量的。

注意以下幾點:

1、私有變量是不能用this來指示的。
2、私有方法類型的變量的調(diào)用必須是在該方法聲明后。如我們將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"); 
代碼執(zhí)行后,將會報"找不到對象"的錯誤.意思是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")); 
執(zhí)行代碼后,系統(tǒng)將會提示 “this.basicInfo為空或不是對象”的錯誤。
基本結(jié)論是,私有方法只能訪問私有屬性,私有屬性在聲明并賦值后可以在類的任何地方訪問,

實例變量:
實例變量即某個實例對象所擁有的變量。如:
復制代碼 代碼如下:
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+"<br>"); 
var basicB = new BasicInfo("zfp",100,"ShenZhen"); 
document.write("basicB's generalInfo is : "+ basicB.generalInfo+"<br>"); 
執(zhí)行該代碼后,我們將可以看到如下結(jié)果: 
basicA's generalInfo is : is 3zfp owned object 
basicB's generalInfo is : undefined 
靜態(tài)變量:

靜態(tài)變量即為某個類所擁有的屬性,通過 類名+"."+靜態(tài)變量名 的方式訪問該屬性。如下可以做清晰的解釋:

復制代碼 代碼如下:
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+"<br>"); 
document.write(BasicInfo.generalInfo+"<br>"); 
BasicInfo.generalInfo = "info is changed"; 
document.write(BasicInfo.generalInfo+"<br>"); 

執(zhí)行以上代碼,將會得到如下結(jié)果:
undefined
is 3zfp owned object
info is changed

注意以下幾點:
1、以 類名+"."+靜態(tài)變量名 的方式來聲明一個靜態(tài)變量
2、靜態(tài)變量并不屬于類的某個實例對象所獨有的屬性,為對象的共享.
3、能以實例對象名+"."+靜態(tài)變量名來訪問。

全局變量:
全局變量即整個系統(tǒng)運行期間有效訪問控制的變量,通常是在一個js代碼開頭定義,如:
復制代碼 代碼如下:
var copyright = "3zfp owned"; 
var foo =function() 

 window.alert(copyright); 
注意以下幾點:
1、如果一個變量不用var 來聲明,則其被視為全局變量。如:
var copyright = "3zfp owned";
var foo =function(fooInfo)
{
 _foo = fooInfo;
document.write(copyright+"<br>");
}
new foo("foo test");
document.write(_foo+"<br>");
執(zhí)行代碼,將得到如下結(jié)果:
3zfp owned
foo test
但是,這個又有一個注意的地方,function是編譯期對象,也就是說_foo這個全局變量要在foo對象被實例化后才能被初始化,也就是說如果將
new foo();
document.write(_foo+"<br>");
對調(diào)成
document.write(_foo+"<br>");
new foo();
系統(tǒng)將提示 "_foo 未定義"。 
2、如果定義了一個和全局變量同名的局部變量屬性,如下:
復制代碼 代碼如下:
var copyright = "3zfp owned"; 
var foo =function(fooInfo) 

 var copyright = fooInfo; //同名變量 
 this.showInfo = function() 
 { 
 document.write(copyright+"<br>"); 
 } 

new foo("foo test").showInfo(); 
document.write(copyright+"<br>"); 
執(zhí)行代碼,將得到如下結(jié)果:
3zfp owned
foo test

原因是由于function 是在編譯期間完成變量的定義,也就是foo內(nèi)部的copyright的定義是在編譯期間完成的,其作用域只在foo對象內(nèi)有效,而與外部定義的全局變量copyright無關。

相關文章

最新評論