专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Javascript教程 » js全局变量:不错的JS中变量相关的细节分析 »正文

js全局变量:不错的JS中变量相关的细节分析

来源: 发布时间:星期六, 2008年12月27日 浏览:60次 评论:0
这里讨论下我对Javascript中变量相关细节认识有不当的处欢迎来批
  、变量类型
  Javascript和Java、C这些语言区别它是种无类型、弱检测语言它对变量定义并不需要声明变量类型我们只要通过赋值形式可以将各种类型数据赋值给同个变量例如:

i=100;//Number类型
i="variable";//String类型
i={x:4};//Object类型
i=[1,2,3];//Array类型
  JS这种特性虽然让我们编码更加灵活但也带来了个弊端不利于Debug编译器弱检测让我们维护冗长代码时相当痛苦
   2、变量声明
  JS中变量申明分显式申明和隐式申明

  var i=100;//显式申明
i=100;//隐式申明
  在中使用var关键字进行显式申明变量是做为局部变量而没有用var关键字使用直接赋值方式声明是全局变量  
  当我们使用访问个没有声明变量时JS会报错而当我们给个没有声明变量赋值时JS不会报错相反它会认为我们是要隐式申明个全局变量定要注意

   3、全局变量和局部变量
  当JS解析器执行时首先就会在执行环境里构建个全局对象我们定义全局属性就是做为该对象属性读取在顶层代码中我们使用this关键字和window对象都可以访问到它体中局部变量只在执行时生成对象中存在执行完毕时局部变量即刻销毁因此在设计中我们需要考虑如何合理声明变量这样既减小了不必要内存开销同时能很大程度地避免变量重复定义而覆盖先前定义变量所造成Debug麻烦
   4、变量作用域
  任何语言中变量作用域都是个很关键细节JS中变量作用域相对和JAVA、C这类语言显得更自由个很大特征就是JS变量没有块级作用域变量在整个都中有效运行下面代码:

<SCRIPT LANGUAGE="JavaScript" type="text/javascript">
//定义个输出
function outPut(s){
document.writeln(s)
}
//全局变量
var i=0;
//定义外部
function outer{
//访问全局变量
outPut(i); // 0
//定义个类部
function inner{
//定义局部变量
var i = 1;
// i=1; 如果用隐式申明 那么就覆盖了全局变量i
outPut(i); //1
}
inner;
outPut(i); //0
}
outer;
</SCRIPT>
  输出结果为0 1 0从上面就可以证明JS如果用var在体中声明变量那么此变量在且只在该体内有效运行结束时本地变量即可销毁了
  由于上面这个JS特性还有个关键问题需要注意此前直使用ActionScript虽然它和JS都是基于ECMA标准但在这里还是略有区别例如下面代码:

<SCRIPT LANGUAGE="JavaScript" type="text/javascript">
//定义个输出
function outPut(s){
document.writeln(s)
}
//全局变量
var i=0;
//定义外部
function outer{
//访问全局变量
outPut(i); // 0
//定义个类部
function inner{
outPut(i); //undefiend
var i=1;
outPut(i); //1
}
inner;
outPut(i); //0
}
outer;
</SCRIPT>
  你可能认为输出结果是0 0 1 0事实上在AS中确实是这样而在JS中输入却是0 und 1 0为何会这样了?刚才我们说到了JS体中声明本地变量在整个中都有效因此在上面代码中var i = 1 ;在inner中都有效实际上显式声明变量i是在预编译时就已经编译到对象中了区别于隐式声明变量在解释时才被定义为全局变量只是在outPut(i)时还没有将它化变量此时本地变量i是未赋值变量而不是未定义变量因此输出了und上面代码等效于下面代码:

function inner{
var i; //定义但不赋值
outPut(i); //undefiend
i=1;
outPut(i); //1
}
  为了避免上面这类问题因此在开始位置集中做声明是个极力推荐做法
   5、基本类型和引用类型
  JS区别于JAVA、C这些语言在变量申明时并不需要声明变量存储空间变量中所存储数据可以分为两类:基本类型和引用类型其中数值、布尔值、null和und属于基本类型对象、属于引用类型
  基本类型在内存中具有固定内存大小例如:数值型在内存中占有 8个字节布尔值只占有个字节对于引用型数据他们可以具有任意长度因此他们内存大小是不定因此变量中存储实际上是对此数据引用通常是内存地址或者指针通过它们我们可以找到这个数据
  引用类型和基本类型在使用行为上也有区别的处:

<SCRIPT LANGUAGE="JavaScript" type="text/javascript">
//定义个输出
function outPut(s){
document.writeln(s)
}
var a = 3;
var b = a;
outPut(b);
//3
a = 4;
outPut(a);
//4
outPut(b);
//3
</SCRIPT>
  对基本类型b进行赋值时实际上是又开辟了块内存空间因此改变变量a值对变量b没有任何影响

<SCRIPT LANGUAGE="JavaScript" type="text/javascript">
//定义个输出
function outPut(s){
document.writeln(s)
}
var a_.gif' /> = [1,2,3];
var b_.gif' /> = a_.gif' />;
outPut(b_.gif' />); //1,2,3
a_.gif' />[3] = 4;
outPut(b_.gif' />);//1,2,3,4
</SCRIPT>

  上面是对引用类型变量赋值实际上他们传递是对内存地址引用因此对a_.gif' />和b_.gif' />存取实际上都是操作块内存区域如果希望重新分配内存空间存储引用型变量那么我就需要使用克隆思路方法或者自定义思路方法来复制引用变量数据

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: