了解javascript中的XHR请求对象...(混淆)

时间:2018-12-27 08:32:35

标签: javascript ajax xmlhttprequest

我正在看一本简单的书,上面写着:

function createRequest() 
{ 
    try 
    {  
        request = new XMLHttpRequest(); 
    } 
    catch (tryMS) 
    {  
        try 
        {   
            request = new ActiveXObject("Msxml2.XMLHTTP");  
        } 
        catch (otherMS) 
        {   
        try 
        {    
            request = new ActiveXObject("Microsoft.XMLHTTP");   
        } 
        catch (failed) 
        {    
            request = null;   
        }   
        }
    } 
 return request; 
 } 

function getDetails(itemName) 
{ 
    var request = createRequest();
    if (request==null) 
    {    alert("Unable to create request");  
        return;  
    } 
    var url= "getDetails.php?ImageID=" +    escape(itemName); 
    request.open("GET",url,true);  
    request.onreadystatechange = displayDetails; 
    request.send(null); 
}


function displayDetails() 
{  
    if (request.readyState == 4) 
    {    
        if (request.status == 200) 
        {      
            detailDiv = document.getElementById("description");      
            detailDiv.innerHTML = request.responseText;    
        }  
    } 
}

上面的所有代码都很好,对我来说也可以。.但几页后它说:

在请求变量之前删除变量关键字非常重要,因此回调可以引用变量...

但是上面的示例如何起作用?如果我们调用变量'request'并在createRequest方法中将其与全局变量映射是巧合吗?

看看下面的图片:

enter image description here

为什么会这样?在一个示例中,使用var之前的request变量并且一切都很好,而在另一个var中避免使用,因此回调中的方法可以访问它。.但是回调中的方法如何访问第一个示例中的request变量...

这令人困惑,因为有两个类似的示例,但有不同的解释。

编辑 附言:要求必须是全球性的? :o

enter image description here

谢谢大家 干杯

2 个答案:

答案 0 :(得分:1)

在两个示例中,都创建了隐式全局变量,以便可以与回调共享它们。 创建第二个请求变量时,它将在getDetails函数内创建一个局部变量。因此,当createRequest()返回全局变量时,局部变量将成为对其的引用。

这是一个非常糟糕的建议,表明作者缺乏理解。但这似乎是一个古老的文本,因为现在已经不推荐使用activeX对象,所以以前可能不太喜欢全局变量。正确的方法是将responseText或responseXML作为参数发送给回调,或者将整个请求作为回调的参数发送。

也许作者不想使请求代码更复杂,但是恕我直言,这不是向人们传授知识的好方法。

function createRequest( method, url, callback, payload ) {
    var request = new XMLHttpRequest();
    if ( !request ) {
        alert( "Unable to create request" );  
        return null;
    }
    request.open( method, url );
    request.onreadystatechange = function() {
        if (request.readyState === 4 && request.status === 200 ) {
            callback( request.responseText );
        }
    };
    request.send( payload );
};
function getDetails( itemName, callback ) {
    createRequest( "GET", "getDetails.php?ImageID=" + escape(itemName), callback, null );
};
function displayDetails( detail ) {
    var detailDiv = document.getElementById("description");      
    detailDiv.innerHTML = detail;
};
getDetails( "someItemName", displayDetails );

答案 1 :(得分:0)

您是正确的,在第一个示例中,函数createRequest未使用var,这意味着您要在执行{时创建一个全局变量 request {1}}。

在大多数情况下,我们应该避免使用gobal var。

request = new XMLHttpRequest();