JavaScript中容易被误解的两个地方

1.       js 中的变量作用域 (Variable Scope)

java,c++ 中不同的地方是, js 中没有块作用域 (Block Scope) 。变量的作用域将从声明一直持续到 function 的结尾。看个例子就会明白了。

   function testScope()

   {

      var a = "a" ;  

 

       function g() { alert (a); }

      g();   // 这里输出结果为 a ,因为 a 的作用域将持续到 function  testScope 的结尾

               

 

     for ( var i=0; i<2; i++)

     {

       var a = "a is changed" ;  // 这里的变量 a 将覆盖开始声明的变量 a

        var b = "b" ;    //b 的作用域从声明一直到 function 的结尾          

 

     }

 

    alert (a);    // 输出结果为   a is changed js 首先查找到的 a 是在循环中定义的那个

    alert (b);    // 输出为 b   java , 此时将访问不到变量 b,b 已经出了作用域 , 但是在 js 中是可以的 .

 

 

   }

 

 

2. js 中的垃圾回收( garbage collection

     js 也是一门采用垃圾回收机制的语言,和 java 一样。 js 的解释器负责分配和回收内存。

  程序员无需像 C ++中那样手动用 delete 释放内存。

但是 js 也有 delete 关键字 它是用来 删除对象的属性,或者删除数组中的指定元素。并不能删除对象本身。用法如下:

语法

delete objectName.property
delete objectName[index]
delete property

参数

objectName

要删除属性或元素的对象。

property

要删除的属性。

index

要删除的数组元素的序号。

 

第三种用法delete property 只能在 with 语句中使用,用来删除对象的属性。

补充:在微软的JScript中有CollectGarbage()函数可以用来回收内存,官方文档不推荐使用此方法,你的程序不应该依赖此方法。IE在最小化的时候会进行回收内存。
  

添加评论
单击隐藏此项的评论。

JavaScript中的传值与传引用

1. 传值 (by value)

变量的值被复制出一份 , 与原来的值将不相干 , 也就是说即使新的值被修改 , 原来的值也不会改变 , JavaScript 中基本类型都是传值的 .

function testPassValue()

{

   var m=1;

   var n=2;

  

   // m,n 的值复制一份 , 传递到 passValue

   passValue(m,n);

  

   alert (m);  // 将是原有的值

}

 

function passValue(a,b)

{

  a = a+b; // 改变 a 的值 , 这里 a 只是原有值的一份 copy

  alert (a);  

										}
								
										输出结果:
								
										
												3
										
								
										
												1
										
										
												 
										
								

2. 传引用 (by reference).

引用本身复制一份传给 function, 引用指向的对象并没有被复制传递 (java 中也是如此 ), function , 如果改变了对象的属性的值 , 由于和原来的引用指向的是同一个对象 , 因此在通过原来的引用访问到的将是修改过的值 ;

但是如果只是在 function 中将引用指向一个新的对象 , 将不会改变原对象的值 , 改变的只是复制的这一份引用 .

function testPassValue()

{

  var date = new Date (2006,02,27);

  alert (date.getDate());  // 输出为 27

 

  // date 引用本身复制一份 , 传递到 passReference, 注意 date 所指向的对象并没有被复

  passReference(date);

  alert (date.getDate());  // 输出为 12

 

  // 同上

  changeReference(date);

  alert (date.getDate());  // 输出还为 12

}

function passReference(da)

{

 // 由于 da 和原引用指向的是同一个对象 , function , 通过原有的引用访问到的将是对象的 日期属性值 , 将是修改之后的值 .

   da.setDate(12); 

}

function changeReference(da)

{

   // 此时 da 引用实际上是原引用的一份 copy, 将引用本身重新赋值 , 将不会影响原引用

   da= new Date (2007,05,11); 

// da 引用指向一个新的对象 , 此时原引用指向的还是原来的对象

   alert (da.getDate());     // 输出为 11

  

}

 

3 特殊的 String  

  JavaScript ,String 也传引用的 . js 中只有 charAt 方法 , 而没有对应的修改方法 , java 中的 String 相同 , 都具有不变性 .

var s1 = "hello" ;

 

var s2 = "hell" + "o" ;

 

if (s1 == s2)   

alert ( "s1 = s2" ) ;         // 这句会不会执行 ? java 用的熟的人可能会认为不会执行 , java 中的 == 比较的是同一性 . 事实上在 js 中对 String== 比较的是值是否相等 , 所以这句 话会执行 . 但是对其他的 Object == 比较和 java 中一样是同一性 .

 

posted on 2006-08-30 09:36 穷鬼 阅读(313) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: