0

私は次の機能を持っています:

function initPaymentBlock(bIdx) {  

    var paymentType = 'default';
    if( $('#gc-apply-btn-'+bIdx).length ) {
        $('#gc-apply-btn-'+bIdx).click( function() { 
            poApplyGiftCard(bIdx); 
            console.log("about to change payment type");
            paymentType = 'credit card';
            console.log("paymentType inside function: " + paymentType);
        });
    }

    console.log("payment type: " + paymentType);
    poGetPaymentOption(paymentType, 0, bIdx);

}

paymentType変数は、最初のステートメント内で「デフォルト」に設定されています。内部のクリック機能では「クレジットカード」に変更。console.log内部関数内でステートメントを実行すると、 が返されますcredit card。内部関数のconsole.log外側 (呼び出しの直前poGetPaymentOption) は、'default' を返します。

問題は変数のスコープであることはわかっていますが、関数呼び出しが正しい値を取得するように変数を設定する方法や場所がわかりませんpoGetPaymentOption(ボタンが実行される前にクリックされていない場合は「デフォルト」、「クレジット」)。ボタンをクリックするとカードが表示されます。) 誰か助けてくれませんか?

4

2 に答える 2

1

スコープに問題はありません。実行の順序がすべてです。

コードの実行方法は次のとおりです。

  • initPaymentBlock関数を入力するときは、「デフォルト」に設定します。
  • 次に、値を「クレジットカード」に変更するクリックハンドラーを作成しますが、誰かがボタンをクリックした後でのみです。
  • 次に、下部のコンソール出力に現在の値が出力されますが、これはまだ「デフォルト」です。
  • これで、ユーザーがボタンをクリックすると、クリックハンドラーが実行され、「クレジットカード」が出力されます。

実行時に予想されるコンソール出力は次のinitPaymentBlock()とおりです。

  • 支払いタイプ:デフォルト

それでおしまい。ボタンをクリックすると、次の出力が表示されます。

  • お支払い方法を変更しようとしています
  • 関数内のpaymentType:クレジットカード
于 2013-03-08T22:25:56.257 に答える
1

そのかなり明白です。クリックすると値が変更されますが、クリック後のみです。2 つ目のコンソール ログは、クリック イベントが発生する前に実行されます。これの何が問題なのですか?

function initPaymentBlock(bIdx) {  

    var paymentType = 'default';
    if( $('#gc-apply-btn-'+bIdx).length ) {
        $('#gc-apply-btn-'+bIdx).click( function() { 
            poApplyGiftCard(bIdx); 
            console.log("about to change payment type");
            paymentType = 'credit card';
            console.log("paymentType inside function: " + paymentType);
            poGetPaymentOption(paymentType, 0, bIdx);
        });
    }
}
于 2013-03-08T22:25:33.487 に答える