0

例如这是我们的一段代码:

function blabla(A,B) {

    // Something

    httpReq.onreadystatechange = function(A,B) {
        if (httpReq.readyState == 4) {
            // console.log(A,B) says 'undefined'
            // How can I use the values of A and B here?
        };
    }
}
4

4 回答 4

2

你只需使用它们。你的问题是阴影。内部函数参数正在覆盖外部函数参数,因为它们具有相同的名称。

通常,对于在同一范围内声明的任何函数,任何局部变量都是可用的。这意味着您只需使用它们,只要您不使用同名的新局部变量来隐藏它们。

function blabla(a, b) {

    // Something

    httpReq.onreadystatechange = function(c, d) {
        // logs undefined, because no arguments are actually passed in
        // so the variables are undefined.
        console.log(c, d);

        // log arguments passed to blabla() because it picks up the reference
        // the parent scope.
        console.log(a, b);
    }
}

blabla('Hi', 'There'); // should log "Hi", "There"

只要您为每个函数的参数使用唯一的变量名,这就是有效的。

于 2012-09-19T20:01:31.887 回答
2

只需使用 A 和 B。闭包支持(JavaScript 的纯基本特性)会处理它。请参阅JavaScript 闭包如何工作?

在你的情况下,

function blabla(A,B) {

    // Something

    httpReq.onreadystatechange = function(paramA, paramB) {
        if (httpReq.readyState == 4) {
            // console.log(A,B) prints A and B arguments of blabla
            // console.log(paramA, paramB) prints actual parameters
        };
    }
}
于 2012-09-19T20:00:12.970 回答
1

您可以将 A 和 B 临时存储在变量中。

var data = {};
function blabla(A,B) {
    data.A = A;
    data.B = B;

    httpReq.onreadystatechange = function() {
        // How can I lead the values of A and B into this?
        console.log(data.A, data.B)
    }
}
于 2012-09-19T20:03:20.147 回答
0

需要将onreadystate change函数放在发送请求之后,同时将open函数的第三个参数设置为false,使其同步。

于 2012-12-06T05:07:12.320 回答