5

クロージャー内の変数の値を変更しようとしています:

var myVariable;
$.ajax({
    //stuff....
    success:function(data) {
        myVariable = data;
    }
});

myVariableクロージャーから見えないため、これは機能しません。の値が変化するようにこのコードを変更するにはどうすればよいmyVariableですか?

4

2 に答える 2

13

あなたの信念に反して、あなたのコードは機能します。しかし、あなたがやろうとしていることを見て、行間を読んでいると、あなたはこれをやろうとしていると思います:

var myVariable;
$.ajax({
    //stuff....
    success:function(data) {
        myVariable = data;
    }
});
alert(myVariable); // at this point myVariable is undefined!!

もしそうなら、非同期関数について学ぶ必要があります。

基本的に、$.ajax()関数は実際に ajax リクエストを送信する前に戻ります。ブラウザが JavaScript の実行で忙しくないときに、後で ajax リクエストを実行します。これは、 の値を警告しようとしたときに、割り当てがまだ行われていないことを意味しますmyVariable

詳細については、こちらの回答をお読みください: JS グローバル変数が最初の反復で設定されていません

唯一の良い解決策は、コーディングに対する考え方を変えることです。(ajax呼び出しを同期に変えることを含む間違いなく悪い解決策がありますが、それには入りません。必要に応じてグーグルで検索するか、マニュアルを読むことができます)。これを行う代わりに:

var myVariable;
$.ajax({
    //stuff....
    success:function(data) {
        myVariable = data;
    }
});
/*
 * Do lots of stuff with the returned value
 * of the myVariable variable
 *
 */

次のように記述する必要があります。

var myVariable;
$.ajax({
    //stuff....
    success:function(data) {
        myVariable = data;
        /*
         * Do lots of stuff with the returned value
         * of the myVariable variable
         *
         */
    }
});

基本的に、ajax 呼び出しの後に記述したすべてのコードを成功のコールバックに移動します。これには慣れる必要があります (この質問のバリエーションがインターネット上にいくつあるかから判断して)。しかし、慣れるとそれが第二の性質になります。

このスタイルのプログラミングには名前があります。「イベント駆動型プログラミング」または「継続渡しスタイル」またはイベント型プログラミング」としてさまざまに知られています。もっと知りたい場合は、さまざまな用語をグーグルで検索できます。

于 2012-11-21T06:26:45.097 に答える
3

そのコードがグローバル スコープ内にある場合、myVariable内部関数に表示されます。ローカル変数によって隠されることが心配な場合は、グローバルのプロパティとして明示的にアクセスしてください。

var myVariable;
$.ajax({
    //stuff....
    success:function(data) {
        window.myVariable = data;
    }
});
于 2012-11-21T06:19:33.127 に答える