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 窮鬼 閱讀(321) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 岳阳县| 兴业县| 内丘县| 彭山县| 封丘县| 巧家县| 祁阳县| 东宁县| 名山县| 海淀区| 静宁县| 秦皇岛市| 宝兴县| 盐亭县| 绵阳市| 扶沟县| 西林县| 句容市| 黑龙江省| 公主岭市| 山阳县| 石渠县| 旺苍县| 绥中县| 韩城市| 阆中市| 闵行区| 阿巴嘎旗| 图木舒克市| 海伦市| 陆河县| 沙河市| 酒泉市| 恭城| 淮滨县| 伊宁市| 吴桥县| 淅川县| 昌都县| 调兵山市| 扎鲁特旗|