JavaScript中容易被誤解的兩個地方

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

          java,c++ 中不同的地方是, js 中沒有塊作用域 (Block Scope) 。變量的作用域?qū)穆暶饕恢背掷m(xù)到 function 的結(jié)尾。看個例子就會明白了。

          ?? function testScope()

          ?? {

          ????? var a = "a" ;??

          ?

          ???? ? function g() { alert (a); }

          ????? g();?? // 這里輸出結(jié)果為 a ,因為 a 的作用域?qū)⒊掷m(xù)到 function? testScope 的結(jié)尾

          ???????????????

          ?

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

          ???? {

          ?????? var a = "a is changed" ;? // 這里的變量 a 將覆蓋開始聲明的變量 a

          ????? ? var b = "b" ;??? //b 的作用域從聲明一直到 function 的結(jié)尾 ?????????

          ?

          ?????}

          ?

          ??? alert (a);??? // 輸出結(jié)果為 ? a is changed js 首先查找到的 a 是在循環(huán)中定義的那個

          ??? alert (b);??? // 輸出為 b?? java , 此時將訪問不到變量 b,b 已經(jīng)出了作用域 , 但是在 js 中是可以的 .

          ?

          ?

          ?? }

          ?

          ?

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

          ? ? ?js 也是一門采用垃圾回收機制的語言,和 java 一樣。 js 的解釋器負責分配和回收內(nèi)存。

          ? 程序員無需像 C ++中那樣手動用 delete 釋放內(nèi)存。

          但是 js 也有 delete 關(guān)鍵字 它是用來 刪除對象的屬性,或者刪除數(shù)組中的指定元素。并不能刪除對象本身。用法如下:

          語法

          delete objectName.property
          delete objectName[index]
          delete property

          參數(shù)

          objectName

          要刪除屬性或元素的對象。

          property

          要刪除的屬性。

          index

          要刪除的數(shù)組元素的序號。

          ?

          第三種用法delete property 只能在 with 語句中使用,用來刪除對象的屬性。

          補充:在微軟的JScript中有CollectGarbage()函數(shù)可以用來回收內(nèi)存,官方文檔不推薦使用此方法,你的程序不應(yīng)該依賴此方法。IE在最小化的時候會進行回收內(nèi)存。
          ??

          添加評論
          單擊隱藏此項的評論。

          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);??

          										}
          								
          										輸出結(jié)果:
          								
          										
          												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 方法 , 而沒有對應(yīng)的修改方法 , java 中的 String 相同 , 都具有不變性 .

          var s1 = "hello" ;

          ?

          var s2 = "hell" + "o" ;

          ?

          if (s1 == s2)???

          alert ( "s1 = s2" ) ;??????? ?// 這句會不會執(zhí)行 ? java 用的熟的人可能會認為不會執(zhí)行 , java 中的 == 比較的是同一性 . 事實上在 js 中對 String== 比較的是值是否相等 , 所以這句 話會執(zhí)行 . 但是對其他的 Object == 比較和 java 中一樣是同一性 .

          ?

          posted on 2006-08-30 09:36 窮鬼 閱讀(316) 評論(0)  編輯  收藏

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


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 洛宁县| 沁源县| 延寿县| 凌源市| 北川| 三河市| 灌南县| 乌鲁木齐市| 北票市| 法库县| 广宗县| 鄂托克前旗| 嘉义县| 遵义县| 大田县| 穆棱市| 尼勒克县| 贞丰县| 绩溪县| 图片| 通城县| 朝阳市| 资阳市| 鄂托克前旗| 华阴市| 盘锦市| 衡阳市| 永昌县| 铜鼓县| 巴青县| 行唐县| 平原县| 潮安县| 鄯善县| 资阳市| 张家界市| 桐梓县| 化州市| 梁河县| 遂溪县| 南昌县|