<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    心遠(yuǎn)專欄

       :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      24 隨筆 :: 0 文章 :: 9 評(píng)論 :: 0 Trackbacks

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


    代碼
    <SCRIPT LANGUAGE="JavaScript">?
    function test(){??
    ??? var a=222;??
    ?document.writeln(a);??
    }??
    test();??
    document.writeln(a);??
    </SCRIPT>?

    ?

    代碼
    <SCRIPT LANGUAGE="JavaScript">?
    function test(){??
    ??? a=222;??
    ?document.writeln(a);??
    }??
    test();??
    document.writeln(a);??
    </SCRIPT>??

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

    代碼
    <SCRIPT LANGUAGE="JavaScript">?
    var x='000';??
    document.writeln(x);??
    a();??
    function a(){??
    ??? var x='aaa';??
    ?function b(){??
    ???? document.writeln(x);??
    ??????? var x='bbb';??
    ? document.writeln(x);??
    ?}??
    ?b();??
    ??? document.writeln(x);??
    }??
    </SCRIPT>?


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

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


    代碼
    <SCRIPT LANGUAGE="JavaScript">?
    var x='000';??
    document.writeln(x);??
    a();??
    function a(){??
    ?function b(){??
    ???? document.writeln(x);??
    ? document.writeln(x);??
    ?}??
    ?document.writeln(x);??
    ?var x='111';??
    ?b();???
    }??
    </SCRIPT>?


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

    代碼
    <SCRIPT LANGUAGE="JavaScript">?
    a();??
    function a(){??
    ??? alert();??
    }??
    </SCRIPT>?


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

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


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


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

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

    ?

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


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

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


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

    ?

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


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

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


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

    代碼
    <SCRIPT LANGUAGE="JavaScript">?
    var o=new Object();??
    o.name="zkj";??
    o.age=25;??
    o.bir=new Date();??
    for(var key in o){??
    document.writeln(key+':'+o[key]+'</br>');??
    }??
    document.writeln('delete o.bir</br>');??
    delete o.bir;??
    for(var key in o){??
    document.writeln(key+':'+o[key]+'</br>');??
    }??
    </SCRIPT>?


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


    代碼
    <SCRIPT LANGUAGE="JavaScript">?
    var x=100;??
    document.writeln(x);??
    add(x);??
    document.writeln('</br>------------------------</br>');??
    var x=200;??
    document.writeln(x);??
    add(x);??
    function add(x){??
    ??? document.writeln(x);???
    ??? var x=300;??
    ??? document.writeln(x);???
    ??? var x=400;??
    ??? document.writeln(x);??
    }??
    </SCRIPT>?


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


    代碼
    <SCRIPT LANGUAGE="JavaScript">?
    var x=100;?? //我們?cè)谌謱?duì)象中加了個(gè)屬性x. 對(duì)比??
    ?//var o=new Object();o.x=100;??
    document.writeln(this.x);//用this訪問全局對(duì)象??
    add(this.x);//把全局對(duì)象的屬性值傳遞對(duì)函數(shù)中??
    document.writeln('</br>------------------------</br>');??
    this.x=200;//把全局變量中的x屬性修改掉??
    document.writeln(window.x);??
    add(window.x);??
    function add(x){??
    ??? //假設(shè)有個(gè)局部對(duì)象,調(diào)用對(duì)象,函數(shù)調(diào)用過程中的對(duì)象??
    //? temp?? temp.x=${傳入的值}??
    ??? document.writeln(x); //哦這打印的可是參數(shù)中的值,也就是temp.x=this.x??
    //的值,??
    ??? var x=300;//把調(diào)用對(duì)象變量的簽名給覆蓋了.??
    ??? document.writeln(x); //打印修改過的值。 temp.x??
    ?var x=400;//temp.x=400?
    ??? document.writeln(x);??
    }??
    </SCRIPT>?


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

    ?

              文章來自:http://www.javaeye.com/article/19506

    posted on 2006-12-10 13:16 心遠(yuǎn) 閱讀(242) 評(píng)論(0)  編輯  收藏 所屬分類: java 軟件開發(fā)其它
    主站蜘蛛池模板: 亚洲经典在线中文字幕| 怡红院亚洲红怡院在线观看| 免费可以在线看A∨网站| 偷自拍亚洲视频在线观看99| 91麻豆国产自产在线观看亚洲| 桃子视频在线观看高清免费视频| 国产精品亚洲片在线va| 亚洲国产精品综合久久网络| 亚洲视频免费在线播放| 香蕉视频免费在线播放| 久久亚洲AV无码精品色午夜麻豆| 国产成人在线免费观看| 三年片在线观看免费大全电影 | 国产午夜亚洲精品不卡| 亚洲成AV人片在线观看| 一本色道久久综合亚洲精品高清 | 成人免费无码精品国产电影| a毛片在线免费观看| 亚洲色大成网站www| 亚洲av日韩av无码| 亚洲XX00视频| 一二三四在线观看免费高清中文在线观看| 一本一道dvd在线观看免费视频 | 亚洲码国产精品高潮在线| 全免费一级午夜毛片| 热re99久久6国产精品免费| 免费国产黄网站在线看| 亚洲三级在线播放| 国产V亚洲V天堂A无码| 国产国产成年年人免费看片| 69影院毛片免费观看视频在线| 一级毛片免费一级直接观看| 亚洲综合国产成人丁香五月激情 | 亚洲网址在线观看| 夜夜春亚洲嫩草影院| 免费一级黄色毛片| 成人免费毛片观看| 国产日本一线在线观看免费| 免费日本一区二区| a级毛片高清免费视频就| 无码毛片一区二区三区视频免费播放|