1

この簡略化されたフィドルでは、後続のフォーム送信で使用される「トークン」の値を再設定しようとしていますが、値を設定しても、次のパススルー「トークン」はQWERTYの初期値に設定されたままです。 。

var token = '';

function pollServer(token) {

    alert("Calling with token: " + token);

    alert("OLD: " + token);
    token = "ASDFG"; // new token
    alert("NEW: " + token);

}

function onsubmit_action() {

    alert("A: " + token);

    if (token === '') {
        // set the initial token
        token = 'QWERTY';
    }

    alert("B: " + token);
    pollServer(token);
    event.preventDefault();

}​

デモ:http://jsfiddle.net/tUtRH/

アラートは次のようになります。

<submit form>
A:
B: QWERTY
Calling with token: QWERTY
OLD: QWERTY
NEW: ASDFG

<submit form>

A: ASDFG

代わりに、2番目のフォームの送信後、次のようになります。

A: QWERTY

顔を平手打ちしたり、頭に冷たい水をかけたりしていただければ幸いです。(明らかに、このコードは最小限のケースをカバーするために削除されています。これは実際には、トークンなどを取得/設定する一連のポーリング/ AJAX呼び出しです。)

4

4 に答える 4

3

あなたの問題は、へのパラメータがpollServerと呼ばれることtokenです。

何が起こっているのかというと、あなたの中にはグローバルではなくpollServerローカルを設定しているのです。token

于 2012-08-14T20:19:11.403 に答える
3

Javascriptは関数スコープです。トークンパラメーターを関数に渡すことにより、グローバル変数の代わりに使用さpollServerれるというローカル変数を作成します。token

これは、SOに関するJSの質問の中で最も一般的なタイプの1つです。それと非同期可変タイミング割り当て。

于 2012-08-14T20:19:18.423 に答える
2

token関数パラメーターによってマスクされたグローバル変数がありますtoken。そのため、関数内での割り当ては関数外では効果がありません。

于 2012-08-14T20:19:35.903 に答える
1

JavaScriptのプリミティブ変数は、値[1]によって渡されます。関数(pollServer()など)を引数を取るだけでなく、変更された値を返すようにし、呼び出し元が関数の戻り値を使用するようにする必要があります。もっと好き:

function pollServer(token) {
   token = 'new value';
   return token;
}

function something_else() {
   var token = 'old value';
   token = pollServer(token);
   if (token != 'old value) {
       alert('Success!');
   }
}

[1] http://snook.ca/archives/javascript/javascript_pass/

于 2012-08-14T20:32:15.257 に答える