对象存储函数的问题

时间:2016-02-23 16:49:54

标签: javascript xmlhttprequest

因此,我创建了一个创建新xmlhttprequest的函数,并获取一个对象,该对象包含构造一个参数所需的所有信息。一切正常,直到我告诉它通过对象完成请求时该做什么(函数的默认值工作正常。)由于某种原因它给了我一个错误"未捕获的ReferenceError:x未定义&#34 ;

window._={
xhr: function(a){
    if(typeof a.method==="undefined"||a.adress==="undefined"){
        console.log("Well, That's not going to work...");
    }
    var x=new XMLHttpRequest();
    x.open(a.method,a.adress,a.asyn);
    if(typeof a.headers!== "undefined"){
        Object.keys(a.headers).forEach(function (key) {
            x.setRequestHeader(key,a.headers[key]);
        });
    }
    if(typeof a.ready==="undefined"){
        a.ready=function(){console.log(x.responseText);}
    }
    x.send();
    x.onreadystatechange = function(){
        if(x.readyState==4&&x.status==200){
            a.ready();
        }
    }
    }
}
window.onload = alert(_.xhr({method:"get",adress:"../php/include/functions.php?function=id_from_username&arg=kiddo",asyn:true,headers:{},ready:function(){console.log(x.responseText);}}));

(指定的url是我的服务器上的一个php文件,它可以在给定GET头?function=samplefunc&arg1=foo&arg2=bar时执行文件中的函数,也可以根据函数的需要执行多个args。在这种情况下,我告诉它查找名为" kiddo"的用户,并将他们的ID返回给我的脚本。)

1 个答案:

答案 0 :(得分:1)

问题是你正在访问xhr函数中定义的变量x,它来自于它的范围之外。

解决方案是使用xhr函数内部的响应文本调用ready函数

window._={
    xhr: function(a){
        if(typeof a.method==="undefined"||a.adress==="undefined"){
        console.log("Well, That's not going to work...");
    }
    var x=new XMLHttpRequest();
    x.open(a.method,a.adress,a.asyn);
    if(typeof a.headers!== "undefined"){
        Object.keys(a.headers).forEach(function (key) {
            x.setRequestHeader(key,a.headers[key]);
        });
    }
    if(typeof a.ready==="undefined"){
        a.ready=function(){console.log(x.responseText);}
    }
    x.send();
    x.onreadystatechange = function(){
        if(x.readyState==4&&x.status==200){
            a.ready(x.responseText);
        }
      }
    }
 }

window.onload = alert(_.xhr({method:"get",adress:"",asyn:true,headers:{},ready:function(responsText){console.log(responsText);}}));