我正在传递一个回调函数,但是当onreadystatechange更改它时,我无法调用此函数,即request.onreadystatechange = func。当我调用ajax请求时,我从服务器得到了正确的响应,但是这个方法func没有被调用。请注意,当我调用getFromServer("http://localhost/ch02/checkName.php?username=sas","func")
function createRequest() {
try {
request = new XMLHttpRequest();
}
catch (failed) {
request = null; }
finally {
return request;
}
}
function func(){
alert("ok");
}
function getFromServer(url,readystateCallback) {
request=createRequest();
if (request == null) {
alert("unable to create request");
} else {
request.open("GET", url, true);
var func= new Function (readystateCallback);
request.onreadystatechange = func;
request.send(null);
}
return request;
}
答案 0 :(得分:1)
如果在全局范围内定义了该函数,它将被添加到window
对象中,因此您可以这样做:
var func = window[readystateCallback];
但是,您应该创建自己的对象,将函数名称映射到函数,而不是依赖于此。这样,您可以访问本地范围内的函数,也无法无意中将某些意外函数作为回调调用。
function func() {
alert("ok");
}
function otherfunc() {
alert("really great");
}
...
var callbacks = {
"func": func,
"otherfunc": otherfunc,
...
}
然后你可以这样做:
function getFromServer(url,readystateCallback) {
request=createRequest();
if (request == null) {
alert("unable to create request");
} else {
request.open("GET", url, true);
var func= callbacks[readystateCallback];
request.onreadystatechange = func;
request.send(null);
}
return request;
}
但真正的,最好的解决方案不是首先传递函数名称。只需传递函数本身,这就是几乎所有使用回调的Javascript接口都可以工作的。所以你应该这样称呼它:
getFromServer("http://localhost/ch02/checkName.php?username=sas", func);
然后你只需:
request.onreadystatechange = readystateCallback;