您好我不确定如何描述这个问题,所以我希望代码能解释我的问题。由ajax函数调用的php脚本(phppage.php)只是回显你好世界。
当使用ajax函数在召回函数中保留警报('a')行时,代码按预期工作,最后一行弹出消息“hello world”。然而,警告('a')行被注释掉,然后最后一行不给出“hello world”,但是值13,就像在构造函数中设置的那样。
我在firefox 3.6.18上尝试这个。
感谢任何帮助。
function A() {
this.b = 13;
function finish(context,response) {
context.b = response;
}
ajax(finish,this);
}
A.prototype = {
constructor: A
}
function ajax(callback,context) {
var http = new XMLHttpRequest();
var url = "phppage.php";
http.open("GET", url, true);
http.onreadystatechange = recall;
function recall() {
alert('a');
if(http.readyState == 4 && http.status == 200) {
callback(context,http.responseText);
}
}
http.send(null);
}
var d = new A();
alert(d.b);
答案 0 :(得分:1)
我发现您的代码存在一些问题。第一个是你的完成功能,你正在使用的上下文变量是非常糟糕的风格和Javascript有一个称为闭包的功能,将为你清理。你的构造函数看起来应该更像这样:
function A() {
this.b = 13;
//this is how you should be storing contexts
var that = this;
function finish(response) {
that.b = response;
}
ajax(finish);
}
即使在构造函数A返回之后,finish也可以访问它。你也不需要你在A下的原型。它实际上什么都不做。
最后我们可以稍微整理一下你的AJAX函数,看起来像这样:
function ajax(callback) {
var http = new XMLHttpRequest();
var url = "phppage.php";
http.open("GET", url, true);
http.onreadystatechange = function() {
alert('a');
if(http.readyState == 4 && http.status == 200) {
callback(http.responseText);
}
}
http.send(null);
}
请注意,这是所有未经测试的代码,所以不保证它会起作用,但我认为它会指向正确的方向。
编辑:
现在我看看你的代码,我意识到它可能正在工作,只是你异步调用ajax,所以它立即返回,你在回复之前回显b的值。
可能想尝试:
http.open("GET", url, false);
(但我上面的所有评论都应该考虑因为它们会真的清理一下)