Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将变量附加到XMLHttpRequest的最佳实践?_Javascript_Ajax - Fatal编程技术网

Javascript 将变量附加到XMLHttpRequest的最佳实践?

Javascript 将变量附加到XMLHttpRequest的最佳实践?,javascript,ajax,Javascript,Ajax,我在网页上有这个脚本(还有一个)。我想附加一个变量,用于onreadystatechange函数(显然,在实际代码中,我用它做了比这里更有趣的事情) 这在我尝试过的浏览器中运行良好,但它让我感到紧张。有没有我应该遵守的惯例?例如,在自定义变量前面加下划线或类似的前缀 顺便说一句,附加一个成员变量感觉完全正确:主要的替代方法是使用一个全局变量,我根本不喜欢它(我可能在页面上有两个XMLHttpRequest对象)。您可以使用 假设此ajax请求位于函数体中,则可以使用var关键字定义myVar,并

我在网页上有这个脚本(还有一个

)。我想附加一个变量,用于
onreadystatechange
函数(显然,在实际代码中,我用它做了比这里更有趣的事情)

这在我尝试过的浏览器中运行良好,但它让我感到紧张。有没有我应该遵守的惯例?例如,在自定义变量前面加下划线或类似的前缀

顺便说一句,附加一个成员变量感觉完全正确:主要的替代方法是使用一个全局变量,我根本不喜欢它(我可能在页面上有两个XMLHttpRequest对象)。

您可以使用

假设此ajax请求位于函数体中,则可以使用
var
关键字定义
myVar
,并将其作为局部变量在
onreadystatechange
函数中使用

var xhr=new XMLHttpRequest();
xhr.open('GET','example.php');
xhr.myVar=0;
xhr.onreadystatechange=function(){
  this.myVar=this.responseText.length;
  var s=this.readyState+":"+this.myVar+":"+this.responseText;
  document.getElementById('x').innerHTML=s;
  };
你可以用

假设此ajax请求位于函数体中,则可以使用
var
关键字定义
myVar
,并将其作为局部变量在
onreadystatechange
函数中使用

var xhr=new XMLHttpRequest();
xhr.open('GET','example.php');
xhr.myVar=0;
xhr.onreadystatechange=function(){
  this.myVar=this.responseText.length;
  var s=this.readyState+":"+this.myVar+":"+this.responseText;
  document.getElementById('x').innerHTML=s;
  };

你现在做的已经很好了。您没有污染全局范围,而是附加到您知道已经在函数中拥有的内容(因为函数onreadystatechange是通过
this
设置为XHR对象来调用的)。但是,您可能需要改进以下几点:

  • 您的变量名与现在一样好。如果您想要/需要调用一个变量
    responseText
    ,该怎么办
  • 范围界定可能会派上用场
  • 您可能真的想了解XHR以及如何实现它。现在,你的代码没有在IE7/8上运行
很多担心都不适用于此,因为XHR只回调一次,但想象一下这种情况:您有一个神秘的类
C
,它有一个名为
feedback
的回调,它接受闭包。此回调触发四次,您需要将同一变量传递给四个回调,而回调不可能更改此变量。你的代码在这一条上出错了。 我知道这很琐碎,但值得在第一枪中全力以赴。您也在逐步采用干式方法

我将如何做到这一点:

function x() {

    ....
    ....

    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'example.php');
    var myVar = 0;
    xhr.onreadystatechange = function() {
        this.myVar = this.responseText.length;
        var s = this.readyState + ":" + myVar + ":" + this.responseText;
        document.getElementById('x').innerHTML = s;
    };

    ....
    ....

}
我不会手动实例化C,而是按如下方式执行:

function callCObject(_c_init_vars, callback) {
  var tempObject = new C(); // Instantiating my "C" object, whatever it may be
  var tCallback = function() {
     callback.apply(this,_c_init_vars);
  }
  tempObject.callback = tCallback;
  tempObject.run();
}

只是为了证明实现:

您所做的已经很好了。您没有污染全局范围,而是附加到您知道已经在函数中拥有的内容(因为函数onreadystatechange是通过
this
设置为XHR对象来调用的)。但是,您可能需要改进以下几点:

  • 您的变量名与现在一样好。如果您想要/需要调用一个变量
    responseText
    ,该怎么办
  • 范围界定可能会派上用场
  • 您可能真的想了解XHR以及如何实现它。现在,你的代码没有在IE7/8上运行
很多担心都不适用于此,因为XHR只回调一次,但想象一下这种情况:您有一个神秘的类
C
,它有一个名为
feedback
的回调,它接受闭包。此回调触发四次,您需要将同一变量传递给四个回调,而回调不可能更改此变量。你的代码在这一条上出错了。 我知道这很琐碎,但值得在第一枪中全力以赴。您也在逐步采用干式方法

我将如何做到这一点:

function x() {

    ....
    ....

    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'example.php');
    var myVar = 0;
    xhr.onreadystatechange = function() {
        this.myVar = this.responseText.length;
        var s = this.readyState + ":" + myVar + ":" + this.responseText;
        document.getElementById('x').innerHTML = s;
    };

    ....
    ....

}
我不会手动实例化C,而是按如下方式执行:

function callCObject(_c_init_vars, callback) {
  var tempObject = new C(); // Instantiating my "C" object, whatever it may be
  var tCallback = function() {
     callback.apply(this,_c_init_vars);
  }
  tempObject.callback = tCallback;
  tempObject.run();
}

只是为了证明实现:

谢谢Arun。你的意思是
this.myVar=…
还是说这是
myVar=…
的打字错误?它不是
this.myVar
,如果你想使用闭包,它应该是
var-myVar=0
Arun,我的意思是:onreadystatechange()的第一行看起来像
this.
部分是一个打字错误,应该是
myVar=this.responseText.length。(但我不想编辑你的答案,以防我误解了你的意图,这不是打字错误。)谢谢阿伦。你的意思是
this.myVar=…
还是说这是
myVar=…
的打字错误?它不是
this.myVar
,如果你想使用闭包,它应该是
var-myVar=0
Arun,我的意思是:onreadystatechange()的第一行看起来像
this.
部分是一个打字错误,应该是
myVar=this.responseText.length。(但我不想编辑你的答案,以防我误解了你的意图,这不是打字错误。)谢谢塞巴斯蒂安。关于IE7/8,您能否详细介绍一下“如何正确执行XHR”?(我猜你是指IE“功能”,其中
this.responseText
只有在
readyState==4
?)拥有所有信息时才会定义!:-)Sebastien,你的意思是我没有检查XMLHttpRequest支持,而是假设它是可用的?出于StackOverflow问题的考虑(特别是在IE7/8中提供XMLHttpRequest的情况下),我对此没有意见。如果不是那样的话,或者不是那样的话,
this.responseText
直到IE7/8中的
readyState==4
才被定义,请出来告诉我你到底在说什么。我关于CBC的观点只是,你的AJAX调用显然不会在IE7或之前运行。没有别的了。在实现时,在XHR对象中存储变量是很好的,直到您需要存储名为
responseText
的变量或任何其他保留的XHR关键字。谢谢Sebastien。关于IE7/8,您能否详细介绍一下“如何正确执行XHR”?(我猜你是指IE“功能”,其中
this.responseText
只有在
readyState==4
?)拥有所有信息时才会定义!:-)塞巴斯蒂安,你的意思是我没有检查XM