空間站

          北極心空

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks

          公告

          本博客主要是在本人收集網(wǎng)上一些精彩技術(shù)文章,有時可能因疏忽轉(zhuǎn)載的時候沒有說明轉(zhuǎn)載出處和作者,如果您認(rèn)為哪篇文章侵犯了你的版權(quán),請通知本人: EMAIL:luwei-80@163.com 歡迎您光臨本博客!

          常用鏈接

          留言簿(15)

          我參與的團(tuán)隊

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          1、關(guān)于變量的聲名
          大家都知道javascript是可以隱式聲名變量的。但要注意,隱式聲名變量總是被創(chuàng)建為全局變量。看以下代碼,情愿javascript語言強(qiáng)制聲明變量。建議大家一定要var聲明變量。

          代碼
          1. < SCRIPT ? LANGUAGE = "JavaScript" > ??
          2. function?test(){ ??
          3. ????var? a = 222 ; ??
          4. ?document.writeln(a); ??
          5. } ??
          6. test(); ??
          7. document.writeln(a); ??
          8. </ SCRIPT > ??

          代碼
          1. < SCRIPT ? LANGUAGE = "JavaScript" > ??
          2. function?test(){ ??
          3. ???? a = 222 ; ??
          4. ?document.writeln(a); ??
          5. } ??
          6. test(); ??
          7. document.writeln(a); ??
          8. </ SCRIPT > ???

          2、關(guān)于變量的作用域
          猜猜以下代碼輸出什么。

          代碼
          1. < SCRIPT ? LANGUAGE = "JavaScript" > ??
          2. var? x = '000' ; ??
          3. document.writeln(x); ??
          4. a(); ??
          5. function?a(){ ??
          6. ????var? x = 'aaa' ; ??
          7. ?function?b(){ ??
          8. ?????document.writeln(x); ??
          9. ????????var? x = 'bbb' ; ??
          10. ??document.writeln(x); ??
          11. ?} ??
          12. ?b(); ??
          13. ????document.writeln(x); ??
          14. } ??
          15. </ SCRIPT > ??


          如果你的答案是 000 undefined bbb aaa。恭喜,ok.當(dāng)代碼用到x變量時,先從函數(shù)塊(權(quán)威指南中用調(diào)用對象來解釋)中找,如果找不到,從上一級函數(shù)塊找,直到找到,如果知道頂層代碼(指var x='000';的位置)還沒找到定義,代碼會報未定義錯誤。

          改一下代碼,得到 000 undefined 111 111

          代碼
          1. < SCRIPT ? LANGUAGE = "JavaScript" > ??
          2. var? x = '000' ; ??
          3. document.writeln(x); ??
          4. a(); ??
          5. function?a(){ ??
          6. ?function?b(){ ??
          7. ?????document.writeln(x); ??
          8. ??document.writeln(x); ??
          9. ?} ??
          10. ?document.writeln(x); ??
          11. ?var? x = '111' ; ??
          12. ?b();? ??
          13. } ??
          14. </ SCRIPT > ??


          3、新的問題
          變量個作用域清楚了,注意上面的代碼。為什么我的function a()定義以前就可以調(diào)用a函數(shù)了,而我的var x='111';前“不可以用”x啊???
          讓我把我的理解一一道來
          首先:以下代碼讓我相信javascript有個預(yù)編譯過程,不是完全按照順序解釋執(zhí)行的。

          代碼
          1. < SCRIPT ? LANGUAGE = "JavaScript" > ??
          2. a(); ??
          3. function?a(){ ??
          4. ????alert(); ??
          5. } ??
          6. </ SCRIPT > ??


          個人理解這個預(yù)編譯過程不會象java/c#那樣把代碼編譯成虛擬機(jī)認(rèn)識的語言,更不會象vb,vc那樣編譯成更底層的語言。猜想只是把這個函數(shù)預(yù)裝載到這段函數(shù)執(zhí)行的全局環(huán)境中,在這個執(zhí)行環(huán)境中,該函數(shù)被標(biāo)識定義過,可以直接使用了。(看到網(wǎng)上很多人寫的AOP的javascript實現(xiàn),其實這個預(yù)編譯過程才是翻譯元數(shù)據(jù)最佳時候,可惜就javascript語言來講,是有些落伍了)

          這個文章主要講變量的一些問題。變量說了,為什么函數(shù)可以,我變量就不可以呢。

          代碼
          1. < SCRIPT ? LANGUAGE = "JavaScript" > ??
          2. document.writeln(a); ??
          3. var? a = 0 ; ??
          4. </ SCRIPT > ??


          為什么我要輸出undefined呢?為什么我a就不可以預(yù)編譯一把呢?
          大家看看以下兩段代碼會輸出什么呢啊???

          代碼
          1. < SCRIPT ? LANGUAGE = "JavaScript" > ??
          2. document.writeln(a); ??
          3. a = 0 ; ??
          4. </ SCRIPT > ??

          代碼
          1. < SCRIPT ? LANGUAGE = "JavaScript" > ??
          2. document.writeln(a); ??
          3. </ SCRIPT > ???

          可能你運行試了,可能你本來就知道,a未定義。哈哈哈,好了。
          現(xiàn)在我確信var a=0;被javascript解釋器“預(yù)編譯過”,至少是記錄下來了。甚至把它的值設(shè)置為 undefined。“undefined”這個詞名字取的很是讓人誤解,怎么能叫未定義呢,分明是javascript中所有變量的初始化值。關(guān)于null與undefined的比較我實在不愿提了。
          注意上面兩段代碼還反映一個現(xiàn)象。隱式聲明的變量是在解釋的時候才把自己定義為全局變量的。

          關(guān)于函數(shù)與變量javascript預(yù)編譯的不同處理,大家可以與java class的加載過程比較下。java也是對基本類型設(shè)出值,對象為null的。(不往遠(yuǎn)扯了)
          4、區(qū)別未定義變量和未附值變量

          代碼
          1. < SCRIPT ? LANGUAGE = "JavaScript" > ??
          2. var?a; ??
          3. document.writeln(a); ??
          4. </ SCRIPT > ??

          代碼
          1. < SCRIPT ? LANGUAGE = "JavaScript" > ??
          2. document.writeln(a); ??
          3. </ SCRIPT > ??


          未定義變量和未附值變量 權(quán)威指南中文版 定義的。通過第三條分析,我覺得變量就應(yīng)該以 定義和未定義變量區(qū)別。未附值變量和undefined有點沖突,javascript不是強(qiáng)類型語言,沒發(fā)附默認(rèn)值,才來了個undefined。
          5、基本類型和引用類型
          熟悉java的朋友可能這部分很清楚。沒啥
          說頭。
          6、javascript的垃圾回收
          關(guān)于這部分內(nèi)容一直沒見著個權(quán)威說法。在javascript權(quán)威指南中有兩小節(jié)提到這個問題。
          對于字符串、對象、數(shù)據(jù)這些沒有固定大小,必須為它們動態(tài)的分配內(nèi)存,但什么時候回收這些內(nèi)存呢?javascript使用和java一樣的garbage collection的方法。

          代碼
          1. var?s= "hello" ; ??
          2. var?u=s.toUpperCase(); ??
          3. s=u;??


          運行這段代碼后,"hello"沒有變量會再用到他,這是"hello"的存儲空間的被垃圾回收了。對于javascript的垃圾回收,你唯一要關(guān)心的是,它一定會進(jìn)行,不要對內(nèi)存擔(dān)心。
          注意,javascript不提供任何的強(qiáng)制垃圾回收或釋放內(nèi)存的運算附或語句。
          javascript的delete運算附和C++中的不同。

          代碼
          1. < SCRIPT ? LANGUAGE = "JavaScript" > ??
          2. var? o = new ?Object(); ??
          3. o.name = "zkj" ; ??
          4. o.age = 25 ; ??
          5. o.bir = new ?Date(); ??
          6. for(var?key?in?o){ ??
          7. document.writeln(key+':'+o[key]+' </ br > '); ??
          8. } ??
          9. document.writeln('delete?o.bir </ br > '); ??
          10. delete?o.bir; ??
          11. for(var?key?in?o){ ??
          12. document.writeln(key+':'+o[key]+' </ br > '); ??
          13. } ??
          14. </ SCRIPT > ??

          7、作為屬性的變量
          猜猜以下代碼會輸出什么。

          代碼
          1. < SCRIPT ? LANGUAGE = "JavaScript" > ??
          2. var? x = 100 ; ??
          3. document.writeln(x); ??
          4. add(x); ??
          5. document.writeln(' </ br > ------------------------ </ br > '); ??
          6. var? x = 200 ; ??
          7. document.writeln(x); ??
          8. add(x); ??
          9. function?add(x){ ??
          10. ????document.writeln(x);? ??
          11. ????var? x = 300 ; ??
          12. ????document.writeln(x);? ??
          13. ????var? x = 400 ; ??
          14. ????document.writeln(x); ??
          15. } ??
          16. </ SCRIPT > ??

          估計很多人能得出正確答案
          100 100 300 400
          ------------------------
          200 200 300 400
          但這里我想引入 全局對象和調(diào)用對象的 概念(javascript權(quán)威指南是這么翻譯滴)

          代碼
          1. < SCRIPT ? LANGUAGE = "JavaScript" > ??
          2. var? x = 100 ;???//我們在全局對象中加了個屬性x.?對比 ??
          3. ?//var? o = new ?Object(); o.x = 100 ; ??
          4. document.writeln(this.x);//用this訪問全局對象 ??
          5. add(this.x);//把全局對象的屬性值傳遞對函數(shù)中 ??
          6. document.writeln(' </ br > ------------------------ </ br > '); ??
          7. this.x = 200 ;//把全局變量中的x屬性修改掉 ??
          8. document.writeln(window.x); ??
          9. add(window.x); ??
          10. function?add(x){ ??
          11. ????//假設(shè)有個局部對象,調(diào)用對象,函數(shù)調(diào)用過程中的對象 ??
          12. //??temp??? temp.x =${傳入的值} ??
          13. ????document.writeln(x);?//哦這打印的可是參數(shù)中的值,也就是 temp.x = this .x ??
          14. //的值, ??
          15. ????var? x = 300 ;//把調(diào)用對象變量的簽名給覆蓋了. ??
          16. ????document.writeln(x);?//打印修改過的值。?temp.x ??
          17. ?var? x = 400 ;// temp.x = 400 ??
          18. ????document.writeln(x); ??
          19. } ??
          20. </ SCRIPT > ??

          在函數(shù)的調(diào)用過程中,假設(shè)有個調(diào)用對象存在,把函數(shù)的參數(shù),和函數(shù)內(nèi)的臨時變量當(dāng)成這個調(diào)用對象的屬性。當(dāng)然這個調(diào)用對象的生命周期很短。
          注意,當(dāng)我們訪問全局變量的屬性入x的時候,不必要用this.x 或window.x訪問,當(dāng)在有<frame><iframe>的頁面時會出現(xiàn)混淆。
          關(guān)于函數(shù)的詳細(xì)討論我后續(xù)會詳細(xì)討論。

          posted on 2006-12-11 12:01 蘆葦 閱讀(311) 評論(0)  編輯  收藏 所屬分類: JAVA其他
          主站蜘蛛池模板: 邯郸市| 秦安县| 即墨市| 通渭县| 江孜县| 古浪县| 东至县| 彝良县| 翼城县| 镇赉县| 衡阳市| 博野县| 吴堡县| 富源县| 资兴市| 阳东县| 锦屏县| 凤山县| 蓬莱市| 莱州市| 伊金霍洛旗| 昌平区| 太白县| 江北区| 密山市| 岫岩| 宣汉县| 盘锦市| 当雄县| 铜陵市| 隆林| 滨海县| 德钦县| 普洱| 桐城市| 色达县| 潞西市| 图木舒克市| 安乡县| 嘉黎县| 加查县|