为变量分配回调函数

时间:2016-04-01 19:35:09

标签: javascript ajax

我正在传递一个回调函数,但是当onreadystatechange更改它时,我无法调用此函数,即request.onreadystatechange = func。当我调用ajax请求时,我从服务器得到了正确的响应,但是这个方法func没有被调用。请注意,当我调用getFromServer("http://localhost/ch02/checkName.php?username=sas","func")

时,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;
}

1 个答案:

答案 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;