2012-01-06 21 views
2

誰かがそれを説明できますか? 警告1javascriptのネストされた匿名関数内の変数

  1. なぜ警告2つのポップ?
  2. なぜ警告でPAGECOUNTの値は1警告2よりも違うのですか?警報1前
function naviSet() 
{ 
    var pageCount; 
    if($.ajax({ 
     type: "POST", 
     url: "http://localhost/mywebsite/wp-content/themes/twentyeleven/more-projects.php", 
     success:function(data) 
     { 
      pageCount = data; 
      alert(pageCount); //alert 1 
      return true; 
     }, 
     error:function() 
     { 
      $("#direction").html("Unable to load projects").show(); 
      return false; 
     } 
    })) alert(pageCount); //alert 2 
} 
+0

... :) –

答えて

1

なぜ警告2つのポップ?

アラート1は、正常なHTTP応答を受信したときに発生するコールバック関数によって起動されます。

アラート2は、HTTP要求が送信されるとすぐに起動します。

ネットワークが遅いです。

なぜアラート1のpageCountの値がアラート2と異なるのですか?

応答を受信した場合、上述のように、同じコールバック関数により、(それが警告される直前に)変更されるからです。

+0

それは遅いネットワークとは何の関係もありませんが、JavaScriptのシングルスレッド自然と。 alert2の前に呼び出すことができないネットワーク時間ゼロのイベント。 –

2

alert1はコールバック内にあります。この関数は、ajax要求が正常に完了したとき(非同期に)呼び出されるだけです。

同じ理由でpageCountが異なる - alert2が呼び出されたときに成功コールバックが行われていない。

1

ajax-functionは、指定されたURL から非同期的にのデータを取得します。これは、コードの残りの部分が実行されている間、バックグラウンドで実行していることを意味します。終了すると、「成功」に割り当てられた機能が呼び出されます(失敗した場合は「エラー」)。

これにより、2番目のアラートが最初に呼び出されます。私が言ったように、残りのコードは、ajax関数が動作している間、実行を続けます。

1

第2のアラートが最初に発生する理由は、ajaxコールが非同期であるためです。本質的にウェブ通話をスケジュールし、すぐに戻る。したがって、それ以降の2番目のアラートである行は、直後に発生します。

ある時点で、Web要求が完了し、success機能が呼び出されます。したがって、その時点で最初のアラートが発生します

2

ほとんどの回答には、非同期呼び出しを行うことが記載されていますが、それは実際の理由ではありません。したがって、JavaScriptはシングルスレッドであり、思考は時間ごとにしか実行できません。

まず、関数を呼び出すと、この関数は実行コンテキストスタックを作成します。この関数は、スタックに追加される他の関数を実行する前に実行されます。この関数では、ajax呼び出しを行い、成功するとsuccess関数が実行コンテキストスタックに置かれます。したがって、この関数はnaviSetの前に決して呼び出すことはできません。 alarm1はnaviSet関数で行われるので、最初に呼び出されます。

そして、あなたの2番目の質問に:私はあなたが信じていると思いますあなたの関数から

$.ajax()trueを返し、あなたのAJAX呼び出しが成功したとpageCountは、データに設定しました。しかし、そうではありません。 $.ajaxはtrueを返しますが、truethyの値は$です。メインjqueryオブジェクトへの参照を返す関数で、関数呼び出しを連鎖させることができます。

関数naviSet()そのasncコールkaleemだって

{ 
    //you create a new var which is undefined 
    var pageCount; 
    // return $ which is a truethy in JavaScript, but it does not mean the ajax call was successful 
    if($.ajax({ 
     type: "POST", 
     url: "http://localhost/mywebsite/wp-content/themes/twentyeleven/more-projects.php", 
     success:function(data) 
     { 
      // now you in the context of your success function 
      // and set the value of your variable to data 
      pageCount = data; 
      alert(pageCount); //alert 1 
      return true; 
     }, 
     error:function() 
     { 
      $("#direction").html("Unable to load projects").show(); 
      return false; 
     } 

    })) 
    //here you are still in the context of your naviSet function where pageCount is undefined 
    alert(pageCount); //alert 2 
}