首頁 web前端 js教程 js变量作用域及可访问性的探讨_javascript技巧

js变量作用域及可访问性的探讨_javascript技巧

May 16, 2016 pm 07:24 PM

每一种语言都有变量的概念,变量是用来存储信息的一个元素。比如下面这个函数: 

复制代码 代码如下:
 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  { 
   sum +=index; 
  } 

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

//document.write("sum is :" +sum+"
"); 
document.write("result is :"+foo(true)+"
"); 
   该代码执行后输出的结果为:“index is :undefined” 和 “result is :0”,我们可以看到希望输出的index变量的值为undefined,也就是未定义。因此我们可以发现,index变量在if语句块结束后即被销毁了。那么“sum”变量呢?这个变量在foo()函数段执行完毕后被销毁了,如果您去掉我注释的那条语句,再执行,您将会发现系统将报错。值得注意的是,如果我把上面的foo()函数改成如下: 

 
复制代码 代码如下:
function foo(flag) 
 { 
  var sum = 0; 
  for(var index=0;index  { 
   sum +=index; 
  } 
  document.write("index is :"+index+"
"); 
  return sum; 

   您将可以看见可以输出index值("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; 
 } 

   这里,我们分别定义了一个origName和FormatIt()两个私有变量(按面向对象的解释,应该用类的属性来称呼)。
   我们把这种情况下的方法也成为变量,因为该情况下的变量是个function类型的变量,而function也属于Object类的继承类。在这种情形下,如果我们定义了 var zfp = new Student("3zfp",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.basicInfo为空或不是对象”的错误。
基本结论是,私有方法只能访问私有属性,私有属性在声明并赋值后可以在类的任何地方访问,

实例变量:
实例变量即某个实例对象所拥有的变量。如:
复制代码 代码如下:
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 3zfp owned object
info is changed

注意以下几点:
1、以 类名+"."+静态变量名 的方式来声明一个静态变量
2、静态变量并不属于类的某个实例对象所独有的属性,为对象的共享.
3、能以实例对象名+"."+静态变量名来访问。

全局变量:
全局变量即整个系统运行期间有效访问控制的变量,通常是在一个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+"
");
}
new foo("foo test");
document.write(_foo+"
");
执行代码,将得到如下结果:
3zfp 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+"
"); 
执行代码,将得到如下结果:
3zfp owned
foo test

原因是由于function 是在编译期间完成变量的定义,也就是foo内部的copyright的定义是在编译期间完成的,其作用域只在foo对象内有效,而与外部定义的全局变量copyright无关。
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1318
25
PHP教程
1269
29
C# 教程
1248
24
JavaScript引擎:比較實施 JavaScript引擎:比較實施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

JavaScript:探索網絡語言的多功能性 JavaScript:探索網絡語言的多功能性 Apr 11, 2025 am 12:01 AM

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

如何使用Next.js(前端集成)構建多租戶SaaS應用程序 如何使用Next.js(前端集成)構建多租戶SaaS應用程序 Apr 11, 2025 am 08:22 AM

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

使用Next.js(後端集成)構建多租戶SaaS應用程序 使用Next.js(後端集成)構建多租戶SaaS應用程序 Apr 11, 2025 am 08:23 AM

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

從C/C到JavaScript:所有工作方式 從C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

JavaScript和Web:核心功能和用例 JavaScript和Web:核心功能和用例 Apr 18, 2025 am 12:19 AM

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

JavaScript在行動中:現實世界中的示例和項目 JavaScript在行動中:現實世界中的示例和項目 Apr 19, 2025 am 12:13 AM

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

See all articles