2011-03-23 59 views
1

我得到了這個例子演示了Stoyan Stefanovs的AJAX 面向對象的JavaScript(第275頁)。在這個例子中,他要求三個不同的文件。我有幾個問題,如果你們任何人都可以提供幫助。JavaScript XMLHttprequests

  1. 什麼是xhr.send('')在做什麼?我們爲什麼需要它?我之前認爲GET與服務器建立了聯繫,那麼爲什麼要發送?
    (另一個問題涉及到關閉,我不`噸完全理解...)

  2. 究竟是越來越爲paramater到function(myxhr)通過呢?

  3. 關於具有(xhr)作爲參數傳遞的匿名函數,是否可以解釋程序中xhr傳遞給匿名函數的哪個點?例如,xhr.open發生了嗎?

  4. 爲什麼函數(myxhr)是必需的?如果要創建關閉,爲什麼在這裏關閉?

  5. 是匿名函數的參數(xhr)作爲參數myxhrfunction(myxhr)中通過一旦匿名函數被調用?

  6. 如果5是真的 - 那xhr傳遞爲function(myxhr) - 爲什麼一個參數是有必要的參數名稱從xhr改爲myxhr

示例代碼:

function request(url, callback){ 
    var xhr = new XMLHttpRequest(); 
    xhr.onreadystatechange = (function(myxhr){ 
    return function() { 
     callback(myxhr); 
    } 
    })(xhr); 
    xhr.open('GET', url, true); 
    xhr.send(''); 
} 

request (
    'http://www.phpied.com/files/jsoop/content.txt', 
    function (o){ 
    document.getElementById('text').innerHTML = o.responseText; 
    } 
); 

request(
    'http://www.phpied.com/files/jsoop/content.html', 
    function(o) { 
    document.getElementById('html').innerHTML = o.responseText; 
    } 
); 

request(
    'http://www.phpied.com/files/jsoop/content.xml', 
    function(o){ 
    document.getElementById('xml').innerHTML = 
    o.responseXML.getElementsByTagName('root')[0].firstChild.nodeValue; 
    } 
); 

回答

2

什麼是xhr.send( '')在做什麼?爲什麼我們 需要它?我以爲GET在 之前就是建立了與 服務器的聯繫,那麼爲什麼這個發送? (該 其他問題涉及到封閉 我`噸完全理解...)

打開剛剛建立的請求。發送實際上發送它。當您發出POST請求時,您需要通過發送。

什麼確切地通過作爲 參數功能(myxhr)?

變量的內容xhr

關於匿名函數, 已經(XHR)作爲參數傳遞, 你能在 程序XHR什麼點解釋被傳遞到 匿名函數?例如,xhr.open發生後是否爲 ?

只要函數被調用(立即定義後跟())。

爲什麼函數(myxhr)是必需的?如果 它是創建關閉,爲什麼在這裏需要關閉 ?

不是。即使xhr變量本地不在request函數(它是),那麼它可以通過this訪問。

是匿名 函數的參數(XHR)函數(myxhr)作爲參數 myxhr獲得通過,一旦 匿名函數被調用?

是的。

如果5是真實的 - 這是XHR作爲 參數傳遞給函數(myxhr) - 這是爲什麼 有必要參數 名字從XHR改爲myxhr?

不是。您可以在不同的作用域重用變量名稱。儘管如此,它並沒有讓人感到困惑。

+0

+1 from me。在此線程中沒有人獲得任何投票之前。 ;-) – Tomalak 2011-03-23 08:02:27

+0

非常感謝您的幫助。 – mjmitche 2011-03-23 10:04:11

1

一個有用的資源來理解這是來自MSDN XMLHHTPRequest ObjectUsing XMLHTTPReuqestobject,但爲簡潔起見,我嘗試很快回答你的問題。

  1. xhr.send();通過Open方法向URL發送請求。
  2. XMLHTTPRequest對象作爲函數參數傳遞function(myxhr)
  3. 'xhr'在接收到某個響應後請求狀態發生變化時傳遞給函數。
  4. 'myxhr'只是您可以隨意更改的參數名稱,但傳遞的對象類型爲XMLHttpResponse。
  5. 根本沒有必要。
+0

非常感謝你 – mjmitche 2011-03-23 10:05:27

1

1 - 什麼是xhr.send('')在做什麼?

它將請求發送到服務器。在調用send()之前沒有網絡活動發生。

1.a - 爲什麼我們需要它?我之前認爲GET在與服務器建立聯繫之前,爲什麼會發送?

因爲open()不與服務器通信。它僅僅是準備請求對象。

2 - 到底什麼才能作爲參數傳遞給function(myxhr)

將對象xhr傳遞給該函數。

(function(myxhr){ /* ... */ })(xhr); 
//-----------------------------^^^ 
// define the function... | ...and call it immediately 

3 - 關於匿名函數,這(XHR)作爲參數傳遞,可你被傳遞給匿名函數哪一點在程序XHR解釋一下嗎?例如,是否在xhr.open發生之後?

它立即通過。 function(myxhr)除了構造和返回其結果(它恰好是另一個函數)之外,沒有別的用途,所以它的整個生命週期就是它被立即定義和調用的單一語句。

4 - 爲什麼函數(myxhr)是必需的?如果要創建關閉,爲什麼在這裏關閉?

事實上,額外的關閉是沒有必要的。這是多餘的。這相當於(同時也建立了一個封閉):

function request(url, callback){ 
    var xhr = new XMLHttpRequest(); 
    xhr.onreadystatechange = (function() { 
     callback(xhr); 
    }); 
    xhr.open('GET', url, true); 
    xhr.send(''); 
} 

關閉是必要的,這樣它註冊到readystatechange事件的回調函數有一定的上下文中運行總是自動創建一個封閉每當功能。被定義爲。它保留了函數定義時在範圍內的變量:上面在內部函數中保留了xhrcallback(和url,也!)的含義,即使它不明確的回調函數是將被執行。

5 - 是一次匿名函數被調用的匿名函數的參數(xhr)function(myxhr)參數myxhr獲得通過?

是的,當匿名的「外部」函數被調用時它會被傳遞(見3)。

6 - 如果5爲真 - xhr作爲參數傳遞給函數(myxhr) - 爲什麼需要將參數名稱從xhr更改爲myxhr?

這是沒有必要的,但比在任何地方使用相同的變量名稱更容易混淆。比較:

var f = (function(i) { 
    /* outer scope i = 4 */ 
    return (function(i) { 
    /* inner scope i = 8 */ 
    return i; 
    })(i + 4); 
})(4); 

// now f is 8 

但是,如果你想使用「外」 i在「內部」的功能,你必須使用比i別的東西作爲內部函數的參數名稱。

+0

非常感謝你的幫助。 – mjmitche 2011-03-23 10:03:43

相關問題