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

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 に答える
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 に答える
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変更関数を配置し、open関数の3番目のパラメーターをfalseに設定する必要があります。

于 2012-12-06T05:07:12.320 に答える