欧美亚洲中文,在线国自产视频,欧洲一区在线观看视频,亚洲综合中文字幕在线观看

      1. <dfn id="rfwes"></dfn>
          <object id="rfwes"></object>
        1. 站長(zhǎng)資訊網(wǎng)
          最全最豐富的資訊網(wǎng)站

          對(duì) onreadystatechange 屬性的理解

          在編寫(xiě) Ajax 方法的時(shí)候,我們經(jīng)常會(huì)寫(xiě)上類(lèi)似于這樣的代碼:

          Ajax 代碼:

          var xmlHttp; //創(chuàng)建一個(gè)XmlHttpRequeset對(duì)象 function createXMLHttpRequest(){ if(window.ActiveXObject){ xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } else if(window.XMLHttpRequest){ xmlHttp = new XMLHttpRequest(); } } //開(kāi)始一個(gè)請(qǐng)求 function startRequest(){ createXMLHttpRequest(); xmlHttp.onreadystatechange = handlestatechange; xmlHttp.open("GET", "SimpleRespose.xml", true); xmlHttp.Send(null); } function handlestatechange(){ if(xmlHttp.readyState == 4){//描述一種"已加載"狀態(tài);此時(shí),響應(yīng)已經(jīng)被完全接收。 if(xmlHttp.status == 200){//200表示成功收到 alert("The Server Replied with:" + xmlHttp.responseText) } } }

          第一次閱讀這段代碼的時(shí)候,我就感到了一點(diǎn)點(diǎn)不對(duì)勁,但是說(shuō)不出來(lái)什么地方不對(duì)勁。隨著對(duì)Ajax代碼的進(jìn)一步了解,這種感覺(jué)時(shí)刻伴隨著我。 后來(lái),我知道了這種感覺(jué)來(lái)自于什么地方。

          看看 startRequest 函數(shù)。我們發(fā)現(xiàn) xmlHttp.onreadystatechange 指向了一個(gè)函數(shù),這個(gè)函數(shù)是在 xmlHttpRequest.readyState 發(fā)生改變的時(shí)候觸發(fā)。我們?cè)賮?lái)看 startRequest 函數(shù),想象一下整個(gè)請(qǐng)求發(fā)送的步驟。現(xiàn)在我們點(diǎn)擊一個(gè)按鈕,觸發(fā)了一個(gè) startRequest 函數(shù)。函數(shù)往下走,第一步是 createXmlHttpRequest(),它的作用是創(chuàng)建一個(gè) xmlHttpRequest 對(duì)象,當(dāng)它完畢的時(shí)候,xmlHttpRequest.readyState 的值是 0( window.alert 跟蹤得到的),程序繼續(xù)往下走,xmlHttp.onreadystatechange = handlestatechange,因?yàn)闋顟B(tài)沒(méi)有改變(xmlHttpRequest.readyState 的值是 0),所以不觸發(fā)函數(shù),緊接著是 Open()和 Send(),那么,整個(gè)函數(shù)從頭到尾都應(yīng)該沒(méi)有觸發(fā) handlestatechange 函數(shù)啊,但是為什么出來(lái)的結(jié)果是正確的呢?

          后來(lái)我用 window.alert 跟蹤 xmlHttp.readystate 的變化,發(fā)現(xiàn)于原來(lái)它運(yùn)行的機(jī)制是這樣的。首先創(chuàng)建一個(gè) xmlHttpRequest 的對(duì)象之后 xmlHttp.readyState 的值是 0 了,然后 xmlHttp.onreadystatechange = handlestatechange 沒(méi)有運(yùn)行。緊接著是 open(),這個(gè)函數(shù)發(fā)生了之后 xmlHttp.readyState 的值是 1 了,那么就會(huì)有一個(gè)斷點(diǎn)在 Open() 函數(shù)處斷開(kāi),保留現(xiàn)場(chǎng),緊接著又返回到 xmlHttp.onreadystatechange = handlestatechange 運(yùn)行,然后再執(zhí)行 Send() 函數(shù),這個(gè)函數(shù)發(fā)生了之后 xmlHttp.readyState 的值是 2 了,接著又返回到 xmlHttp.onreadystatechange = handlestatechange 運(yùn)行。以此類(lèi)推。

          瀏覽器因?yàn)椴荒苷嬲叵衩嫦驅(qū)ο竽敲淳幊?,所以找了個(gè)折衷的辦法,但是這個(gè)辦法看起來(lái)不倫不類(lèi),想了半天,再跟一個(gè)同學(xué)一起討論,才得出這樣的一個(gè)結(jié)果。

          onreadystatechange:設(shè)置為指向 handlestatechange的函數(shù)的指針(比較難理解些)

          函數(shù)是具有執(zhí)行特定功能的子程序,編譯后,它的執(zhí)行代碼分配在代碼段,而其參數(shù)及變量則在堆棧段,因而主程序調(diào)用函數(shù)時(shí),實(shí)際上就是將程序執(zhí)行地址轉(zhuǎn)移為函數(shù)在代碼段的入口地址去執(zhí)行,即每個(gè)函數(shù)都有一個(gè)在代碼段的確定入口地址,依此程序執(zhí)行,當(dāng)遇到返回指令時(shí)(表示該程序結(jié)束),程序便返回到該函數(shù)調(diào)用者的斷點(diǎn)程序處,又繼續(xù)執(zhí)行,既然函數(shù)有確定的入口地址(實(shí)際上函數(shù)名就代表了它的入口地址),因而可以用指針指向它,這個(gè)指針又稱(chēng)為函數(shù)指針。

          原文地址:http://blog.chinaunix.net/uid-20730110-id-1883890.html

          贊(0)
          分享到: 更多 (0)
          網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)