熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

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

2013-11-15 11:46:45  來源: JSP教程 
 

  每一種語言都有變量的概念變量是用來存儲信息的一個元素比如下面這個函數

  function Student(nameagefrom)
 {
  thisname = name;
  thisage = age;
  thisfrom = from;
  thisToString = function()
  {
   return my information is name: +thisname+age : +thisage+ from : +thisfrom;
  }
}
   Student類有三個變量分別為name(名字)age(年齡)from(籍貫)這三個變量構成了描述一個對象的信息當然這裡還有一個方法用來返回Student的信息
   但是我們是不是定義了一個變量它就能一直存在著並且還有可能在任何地方都能被訪問和使用直到其被銷毀?仔細想想上面的需求是比較過分的因為某些變量在某個功能實現後就不再利用了但如果這個變量還存在的話就占用了系統資源了俗語曰站著茅坑不拉#&#;$%
   於是我們對變量的及時和按需求地銷毀有一個探討的話題了
   好切入正題吧就本人所接觸過的來講js中支持如下幾種類型的變量分別為:局部變量類變量私有變量實例變量靜態變量和全局變量接下來我們就一一探討研究下

  局部變量

  局部變量一般指在{}范圍內有效變量也就是語句塊內有效的變量

  function foo(flag)
 {
  var sum = ;
  if(flag == true)
  {
   var index;
   for(index=;index<;index++)
   {
    sum +=index;
  }
}
documentwrite(index is :+index+<br>);
return sum;
}
//documentwrite(sum is : +sum+<br>);
documentwrite(result is :+foo(true)+<br>);
   該代碼執行後輸出的結果為index is :undefinedresult is :我們可以看到希望輸出的index變量的值為undefined也就是未定義因此我們可以發現index變量在if語句塊結束後即被銷毀了那麼sum變量呢?這個變量在foo()函數段執行完畢後被銷毀了如果您去掉我注釋的那條語句再執行您將會發現系統將報錯值得注意的是如果我把上面的foo()函數改成如下:

  function foo(flag)
 {
  var sum = ;
  for(var index=;index<;index++)
  {
   sum +=index;
  }
  documentwrite(index is :+index+<br>);
  return sum;
}

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

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

  私有變量
   私有變量值得是某個類自己內部是用的一個屬性外部無法調用其定義是用 var 來聲明的注意如果不用var 來聲明該變量將是全局變量(我們下面將會討論)

  function Student(nameagefrom)
 {
 
  thisname = FormatIt(name);
  thisage = age;
  thisfrom = from;
  var origName = name;
  var FormatIt = function(name)
  {
  return namesubstr();
}
thisToString = function()
{
  return my information is name: +origName+age : +thisage+ from : +thisfrom;
}
}


   這裡我們分別定義了一個origName和FormatIt()兩個私有變量(按面向對象的解釋應該用類的屬性來稱呼)
   我們把這種情況下的方法也成為變量因為該情況下的變量是個function類型的變量而function也屬於Object類的繼承類在這種情形下如果我們定義了 var zfp = new Student(zfpShenZhen)但無法通過zfporigName和zfpFormatIt()方式來訪問這兩個變量的

  注意以下幾點

  私有變量是不能用this來指示的
私有方法類型的變量的調用必須是在該方法聲明後如我們將Student類改造如下

  function Student(nameagefrom)
 {
  var origName = name;
  thisname = FormatName(name);
  thisage = age;
  thisfrom = from;
  var FormatName = function(name)
  {
   return name+china;
}
thisToString = function()
{
  return my information is name: +origName+age : +thisage+ from : +thisfrom;
}
}
var zfp = new Student(zfpShenZhen);
代碼執行後將會報找不到對象的錯誤意思是FormatName()未定義

  私有方法無法訪問this指示的變量(公開變量)如下

  
 function Student(basicinfo)
 {
  thisbasicInfo = basicinfo;
 
  var FormatInfo = function()
  {
   thisbasicInfoname = thisbasicInfoname+china;
  }
FormatInfo();

}
function BasicInfo(nameagefrom)
{
thisname = name;
thisage = age;
thisfrom = from;
}
var zfp = new Student(new BasicInfo(zfpShenZhen));


執行代碼後系統將會提示 thisbasicInfo為空或不是對象的錯誤
基本結論是私有方法只能訪問私有屬性私有屬性在聲明並賦值後可以在類的任何地方訪問

  實例變量
實例變量即某個實例對象所擁有的變量

  
 function BasicInfo(nameagefrom)
 {
  thisname = name;
  thisage = age;
  thisfrom = from;
 }
 var basicA = new BasicInfo(zfpShenZhen);
 basicAgeneralInfo = is zfp owned object;
documentwrite(basicAs generalInfo is : + basicAgeneralInfo+<br>);
var basicB = new BasicInfo(zfpShenZhen);
documentwrite(basicBs generalInfo is : + basicBgeneralInfo+<br>);
執行該代碼後我們將可以看到如下結果
basicAs generalInfo is : is zfp owned object
basicBs generalInfo is : undefined

靜態變量

  靜態變量即為某個類所擁有的屬性通過 類名++靜態變量名 的方式訪問該屬性如下可以做清晰的解釋

  function BasicInfo(nameagefrom)
 {
  thisname = name;
  thisage = age;
  thisfrom = from;
 }
 BasicInfogeneralInfo = is zfp owned object;
 var basic = new BasicInfo(zfpShenZhen);
 documentwrite(basicgeneralInfo+<br>);
documentwrite(BasicInfogeneralInfo+<br>)
BasicInfogeneralInfo = info is changed;
documentwrite(BasicInfogeneralInfo+<br>)
執行以上代碼將會得到如下結果
undefined
is zfp owned object
info is changed

  注意以下幾點
以 類名++靜態變量名 的方式來聲明一個靜態變量
靜態變量並不屬於類的某個實例對象所獨有的屬性為對象的共享
能以實例對象名++靜態變量名來訪問

  全局變量
全局變量即整個系統運行期間有效訪問控制的變量通常是在一個js代碼開頭定義

  
var copyright = zfp owned;
var foo =function()
{
windowalert(copyright);
}
注意以下幾點

  如果一個變量不用var 來聲明則其被視為全局變量

  var copyright = zfp owned;
var foo =function(fooInfo)
{
_foo = fooInfo;
documentwrite(copyright+<br>);
}
new foo(foo test);
documentwrite(_foo+<br>);
執行代碼將得到如下結果
zfp owned
foo test
但是這個又有一個注意的地方function是編譯期對象也就是說_foo這個全局變量要在foo對象被實例化後才能被初始化也就是說如果將
new foo();
documentwrite(_foo+<br>);
對調成
documentwrite(_foo+<br>);
new foo();
系統將提示 _foo 未定義
如果定義了一個和全局變量同名的局部變量屬性如下

  
 
 var copyright = zfp owned;
 var foo =function(fooInfo)
 {
  var copyright = fooInfo; //同名變量
  thisshowInfo = function()
  {
   documentwrite(copyright+<br>);
}
}
new foo(foo test)showInfo();
documentwrite(copyright+<br>);
執行代碼將得到如下結果
zfp owned
foo test

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


From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19607.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.