2009-08-14 97 views
2

我以爲我有這種混亂在我腦海中整理出來,但由於某種奇怪的原因,它不工作。Javascript本地vs全球

如果你在一個函數/範圍之外聲明一個變量,並且在一個函數內沒有引用var,那麼它會改變先前聲明的變量......對嗎?

但是,第一次警報返回正確的價格,但第二次(最後一次)警報返回0.我做錯了什麼?

//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? – 2009-08-14 04:54:39

+0

@meder:回調函數就在代碼中...沒有沒有額外的聲明 – 2009-08-14 04:56:41

回答

8

您正在使用A jax請求。

那些未指定的地方是A同步:它們在後臺執行,而不停止執行腳本的其餘部分。

因此,最後一行代碼上的alert在Ajax請求完成之前執行;這意味着當時price仍然是0。

改變這種情況的一種方法是使用同步請求(請參閱async option);但我強烈建議不要這樣做;引用該文檔:

缺省情況下,所有的請求被髮送 異步(即這是通過默認設置爲true )。如果您需要同步 請求,請將此選項設置爲false。 請注意,當 請求處於活動狀態時,同步請求可能會暫時鎖定瀏覽器 以禁用任何操作。

而你絕對不希望你的應用程序凍結整個瀏覽器!

您應該重新考慮應用程序的設計方式,在這種情況下:您只能在完成Ajax請求後使用「價格」信息 - 這可能意味着您應該在調用的函數內放置更多代碼它的成功:僅僅在$.get之後放置代碼是不夠的。

3

HTTPRequests的使用不用彷徨是異步的,從而爲請求的回調尚未觸發第一個警報(第二宣)會提醒原始值。

+0

奇怪。我實際上並沒有使用價格變量,直到後來出現If和For循環(基本上是大量的線下來)。但到那時,它還沒有接受我所假設的呼叫。如果我只是改變發佈會按預期工作嗎? – rideon88 2009-08-14 04:59:19

+0

號碼後,獲取仍然是異步的 – 2009-08-14 05:05:08