站長資訊網
最全最豐富的資訊網站

對 onreadystatechange 屬性的理解

在編寫 Ajax 方法的時候,我們經常會寫上類似于這樣的代碼:

Ajax 代碼:

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

第一次閱讀這段代碼的時候,我就感到了一點點不對勁,但是說不出來什么地方不對勁。隨著對Ajax代碼的進一步了解,這種感覺時刻伴隨著我。 后來,我知道了這種感覺來自于什么地方。

看看 startRequest 函數。我們發現 xmlHttp.onreadystatechange 指向了一個函數,這個函數是在 xmlHttpRequest.readyState 發生改變的時候觸發。我們再來看 startRequest 函數,想象一下整個請求發送的步驟。現在我們點擊一個按鈕,觸發了一個 startRequest 函數。函數往下走,第一步是 createXmlHttpRequest(),它的作用是創建一個 xmlHttpRequest 對象,當它完畢的時候,xmlHttpRequest.readyState 的值是 0( window.alert 跟蹤得到的),程序繼續往下走,xmlHttp.onreadystatechange = handlestatechange,因為狀態沒有改變(xmlHttpRequest.readyState 的值是 0),所以不觸發函數,緊接著是 Open()和 Send(),那么,整個函數從頭到尾都應該沒有觸發 handlestatechange 函數啊,但是為什么出來的結果是正確的呢?

后來我用 window.alert 跟蹤 xmlHttp.readystate 的變化,發現于原來它運行的機制是這樣的。首先創建一個 xmlHttpRequest 的對象之后 xmlHttp.readyState 的值是 0 了,然后 xmlHttp.onreadystatechange = handlestatechange 沒有運行。緊接著是 open(),這個函數發生了之后 xmlHttp.readyState 的值是 1 了,那么就會有一個斷點在 Open() 函數處斷開,保留現場,緊接著又返回到 xmlHttp.onreadystatechange = handlestatechange 運行,然后再執行 Send() 函數,這個函數發生了之后 xmlHttp.readyState 的值是 2 了,接著又返回到 xmlHttp.onreadystatechange = handlestatechange 運行。以此類推。

瀏覽器因為不能真正地像面向對象那么編程,所以找了個折衷的辦法,但是這個辦法看起來不倫不類,想了半天,再跟一個同學一起討論,才得出這樣的一個結果。

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

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

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

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
中文字幕日韩一区二区三区不卡| 亚洲精品无码你懂的| 国产午夜亚洲精品国产成人小说 | 精品人妻无码一区二区色欲产成人| 99热精品在线免费观看| 国产亚洲精品xxx| 99re热视频这里只精品| 国产精品福利片免费看| 步兵精品手机在线观看| 日韩放荡少妇无码视频| 日韩电影一区二区| 男人扒开女人下添高潮日韩视频 | 国产精品亚洲一区二区三区在线| 国产精品午夜福利在线无码| 亚洲AV蜜桃永久无码精品| 青青热久久国产久精品 | 精品人妻少妇一区二区| 中文字幕精品一区| 国产成人无码精品一区二区三区| 久久国产精品免费| 精品精品国产理论在线观看| 亚洲精品专区在线观看| 国产精品午睡沙发系列| 伊人久99久女女视频精品免| 国产成人精品日本亚洲专一区 | 国产精品毛片无遮挡高清| www亚洲精品久久久乳| 精品日产卡一卡二卡三入口| 亚洲国产精品日韩av不卡在线| 交换国产精品视频一区| 国内精品久久久久影院亚洲| 3D动漫精品啪啪一区二区下载| 精品91自产拍在线| 亚洲日韩一区精品射精| 亚洲日韩一区精品射精| 精品一区二区ww| 国产精品视频免费一区二区| 精品无码成人久久久久久| 日韩国产成人资源精品视频| 国产精品久免费的黄网站| 国产精品一区二区AV麻豆|