對onreadystatechange屬性的理解

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





第一次閱讀這段代碼的時候,我就感到了一點點不對勁,但是說不出來什麼地方不對勁。隨著對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的函數的指針(比較難理解些)


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

沒有留言:

張貼留言