分享
 
 
 

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

王朝html/css/js·作者佚名  2008-05-30
窄屏简体版  字體: |||超大  

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

1function Student(name,age,from)

2{

3 this.name = name;

4 this.age = age;

5 this.from = from;

6 this.ToString = function()

7 {

8 return "my information is name: "+this.name+",age : "+this.age+", from :" +this.from;

9 }

10}

Student类有三个变量,分别为name(名字),age(年龄),from(籍贯),这三个变量构成了描述一个对象的信息。当然,这里还有一个方法用来返回Student的信息。

但是,我们是不是定义了一个变量,它就能一直存在着,并且还有可能在任何地方都能被访问和使用直到其被销毁?仔细想想,上面的需求是比较过分的,因为某些变量在某个功能实现后就不再利用了,但如果这个变量还存在的话,就占用了系统资源了,俗语曰:“站着茅坑不拉#$%”。

于是我们对变量的及时和按需求地销毁有一个探讨的话题了。

好,切入正题吧,就本人所接触过的来讲,js中支持如下几种类型的变量,分别为:局部变量、类变量、私有变量、实例变量、静态变量和全局变量。接下来我们就一一探讨研究下。

局部变量:

局部变量一般指在{}范围内有效变量,也就是语句块内有效的变量,如:

1function foo(flag)

2{

3 var sum = 0;

4 if(flag == true)

5 {

6 var index;

7 for(index=0;index<10;index++)

8 {

9 sum +=index;

10 }

11 }

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

13 return sum;

14}

15//document.write("sum is :" +sum+"<br>");

16document.write("result is :"+foo(true)+"<br>");

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

1function foo(flag)

2{

3 var sum = 0;

4 for(var index=0;index<10;index++)

5 {

6 sum +=index;

7 }

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

9 return sum;

10}

您将可以看见可以输出index值("index is :10"),这个是js和其他语言的不同地方,因为index是在for循环的{}外面定义的,因此其作用范围在foo()函数使用完毕后才销毁。

类变量:

类变量,实际上就是类的一个属性或字段或一个方法,该变量在该类的一个实例对象被销毁后自动销毁,比如我们开始时举的Student类。这个我们不多讨论,大家可以自己试一下。

私有变量:

私有变量,值得是某个类自己内部是用的一个属性,外部无法调用,其定义是用 var 来声明的。注意如果不用var 来声明,该变量将是全局变量(我们下面将会讨论),如:

1function Student(name,age,from)

2{

3

4 this.name = FormatIt(name);

5 this.age = age;

6 this.from = from;

7 var origName = name;

8 var FormatIt = function(name)

9 {

10 return name.substr(0,5);

11 }

12 this.ToString = function()

13 {

14 return "my information is name: "+origName+",age : "+this.age+", from :" +this.from;

15 }

16}

17

18

这里,我们分别定义了一个origName和FormatIt()两个私有变量(按面向对象的解释,应该用类的属性来称呼)。

我们把这种情况下的方法也成为变量,因为该情况下的变量是个function类型的变量,而function也属于Object类的继承类。在这种情形下,如果我们定义了 var zfp = new Student("3zfp",100,"ShenZhen")。但无法通过zfp.origName和zfp.FormatIt()方式来访问这两个变量的。

注意以下几点:

1、私有变量是不能用this来指示的。

2、私有方法类型的变量的调用必须是在该方法声明后。如我们将Student类改造如下:

1function Student(name,age,from)

2{

3 var origName = name;

4 this.name = FormatName(name);

5 this.age = age;

6 this.from = from;

7 var FormatName = function(name)

8 {

9 return name+".china";

10 }

11 this.ToString = function()

12 {

13 return "my information is name: "+origName+",age : "+this.age+", from :" +this.from;

14 }

15}

16var zfp = new Student("3zfp",100,"ShenZhen");

代码执行后,将会报"找不到对象"的错误.意思是FormatName()未定义。

3、私有方法无法访问this指示的变量(公开变量),如下:

1

2function Student(basicinfo)

3{

4 this.basicInfo = basicinfo;

5

6 var FormatInfo = function()

7 {

8 this.basicInfo.name = this.basicInfo.name+".china";

9 }

10 FormatInfo();

11

12}

13function BasicInfo(name,age,from)

14{

15 this.name = name;

16 this.age = age;

17 this.from = from;

18}

19var zfp = new Student(new BasicInfo("3zfp",100,"ShenZhen"));

20

21

执行代码后,系统将会提示 “this.basicInfo为空或不是对象”的错误。

基本结论是,私有方法只能访问私有属性,私有属性在声明并赋值后可以在类的任何地方访问,

实例变量:

实例变量即某个实例对象所拥有的变量。如:

1

2function BasicInfo(name,age,from)

3{

4 this.name = name;

5 this.age = age;

6 this.from = from;

7}

8var basicA = new BasicInfo("3zfp",100,"ShenZhen");

9basicA.generalInfo = "is 3zfp owned object";

10document.write("basicA's generalInfo is : "+ basicA.generalInfo+"<br>");

11var basicB = new BasicInfo("zfp",100,"ShenZhen");

12document.write("basicB's generalInfo is : "+ basicB.generalInfo+"<br>");

13执行该代码后,我们将可以看到如下结果:

14basicA's generalInfo is : is 3zfp owned object

15basicB's generalInfo is : undefined

16

静态变量:

静态变量即为某个类所拥有的属性,通过 类名+"."+静态变量名 的方式访问该属性。如下可以做清晰的解释:

1function BasicInfo(name,age,from)

2{

3 this.name = name;

4 this.age = age;

5 this.from = from;

6}

7BasicInfo.generalInfo = "is 3zfp owned object";

8var basic = new BasicInfo("zfp",100,"ShenZhen");

9document.write(basic.generalInfo+"<br>");

10document.write(BasicInfo.generalInfo+"<br>");

11BasicInfo.generalInfo = "info is changed";

12document.write(BasicInfo.generalInfo+"<br>");

执行以上代码,将会得到如下结果:

undefined

is 3zfp owned object

info is changed

注意以下几点:

1、以 类名+"."+静态变量名 的方式来声明一个静态变量

2、静态变量并不属于类的某个实例对象所独有的属性,为对象的共享.

3、能以实例对象名+"."+静态变量名来访问。

全局变量:

全局变量即整个系统运行期间有效访问控制的变量,通常是在一个js代码开头定义,如:

1

2var copyright = "3zfp owned";

3var foo =function()

4{

5 window.alert(copyright);

6}

注意以下几点:

1、如果一个变量不用var 来声明,则其被视为全局变量。如:

1var copyright = "3zfp owned";

2var foo =function(fooInfo)

3{

4 _foo = fooInfo;

5 document.write(copyright+"<br>");

6}

7new foo("foo test");

8document.write(_foo+"<br>");

执行代码,将得到如下结果:

3zfp owned

foo test

但是,这个又有一个注意的地方,function是编译期对象,也就是说_foo这个全局变量要在foo对象被实例化后才能被初始化,也就是说如果将

new foo();

document.write(_foo+"<br>");

对调成

document.write(_foo+"<br>");

new foo();

系统将提示 "_foo 未定义"。

2、如果定义了一个和全局变量同名的局部变量属性,如下:

1

2

3var copyright = "3zfp owned";

4var foo =function(fooInfo)

5{

6 var copyright = fooInfo; //同名变量

7 this.showInfo = function()

8 {

9 document.write(copyright+"<br>");

10 }

11}

12new foo("foo test").showInfo();

13document.write(copyright+"<br>");

执行代码,将得到如下结果:

3zfp owned

foo test

原因是由于function 是在编译期间完成变量的定义,也就是foo内部的copyright的定义是在编译期间完成的,其作用域只在foo对象内有效,而与外部定义的全局变量copyright无关。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有