2009-08-14 10 views
2

私はこの混乱が頭の中で整理されていると思っていましたが、何らかの奇妙な理由でそれが機能しないと思いました。Javascript Local vs Global

関数/スコープ外の変数を宣言し、関数内で変数なしで参照すると、以前に宣言された変数が変更されます。

ただし、最初のアラートは正しい価格を返しますが、2番目のアラートは0を返します。何が間違っていますか?要求のためのコールバックがまだトリガされていないように、第1の警告(宣言された第二の)元の値を警告するように.getを用い

//get pricing 
var price=0; 
var modelid = $("#model_input").val(); 
var inCode = $("#code_input").val(); 
$.get("getpricing.php", { 'modelid': modelid ,'code' : inCode }, function(data){ 
    price = data; 
    alert(price); 
}); 
alert(price); 
+0

$ .getに与えられた関数内で価格変数を定義していますか? –

+0

@meder:コード内にコールバック関数があります。いいえ、余分な宣言はありません。 –

答えて

8

jax要求を使用しています。

特に指定されていないものは、です。これらのスクリプトは、スクリプトの残りの部分の実行を停止することなくバックグラウンドで実行されます。

したがって、最後のコード行のalertはAjaxリクエストが終了する前に実行されます。その時点ではpriceがまだ0であることを意味します。

これを変更するには、同期要求を使用する方法があります(async option参照)。しかし、私はそれに強く反対します。ドキュメント引用:デフォルトでは

を、すべての要求は(すなわち、これはデフォルトでtrue に設定されている) 非同期に送信されます。同期 要求が必要な場合は、このオプションをfalseに設定します。 要求がアクティブである間に、同期要求が ブラウザを一時的にロックする可能性があります。 は任意の操作を無効にすることに注意してください。

あなたは、アプリケーションがブラウザ全体をフリーズすることは間違いありません。

この場合、アプリケーションの設計方法を再考する必要があります.Ajaxリクエストの完了後にのみ「価格」情報を使用できます。これは、おそらく、その成功:ちょうど$.getの後にコードを配置するだけでは不十分です。

3

httprequestsは、非同期です。

+0

奇妙です。私は実際に価格変数を使用していないし、後でIfとForループ(基本的に1トンの行がダウン)までです。しかしそれまでには、私はまだ電話をしていない。私はちょうどそれが期待どおりに動作するようにポストに変更する場合? – rideon88

+0

いいえ投稿と取得はまだ非同期です –