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上运行
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上运行
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