javascript

位置:IT落伍者 >> javascript >> 浏览文章

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


发布日期:2022年09月21日
 
js变量作用域及可访问性的探讨

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

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无关

上一篇:Javascript图片播放类ImageSlide.iclass.js

下一篇:JavaScript实现酷“网页时钟”