2013-05-16 18 views
0

爲什麼x在第11行定義時未定義?JavaScript,Ajax,Json:如何使用值取決於json響應的變量?

<script> 
    var x; 
    $.ajax({ 
    dataType: "json", 
    url: myurl, 
    success: function(data){ 
     console.log(data); 
     x = data; 
     document.write(x); 
    } 
    }); 
    document.write(x); 
</script> 
+1

範圍與ajax或json無關。 – Bergi

+0

[如何返回AJAX響應文本?]的可能重複(http://stackoverflow.com/questions/1225667/how-to-return-ajax-response-text) – Quentin

+2

應該關閉...已經有噸的關於這個的問題。 – plalx

回答

1

這是因爲AJAX(異步)回調函數的成功執行,並在line 8設置值之前line 11得到執行。

你可以這樣做。

function MakeAjaxCall(callback) 
{ 
    $.ajax({ 
    dataType: "json", 
    url: myurl, 
    success: function(data){ 
     console.log(data); 
     callback(data); 

    } 
    }); 
} 
function wantToCallAjaxAndUseResult() 
{ 

    MakeAjaxCall(function(x){console.log(x)}); 
} 
1

這與AJAX更多的是異步的,而不是變量的範圍。控制立即進行到線路11,其中x未定義。然而,行8將在將來的某個不確定點執行(即,在請求完成並且success回調被調用並執行之後),在行11執行後。

+3

不僅「*最有可能*」,而且「*絕對*」:-) – Bergi

+0

@Bergi這是真的:) –

5

因爲你在這裏有異步行爲。 你的程序的流程實際上是這樣的:

1-聲明X

2 - 你讓一個Ajax請求

3 - 你寫X到文檔中(在這一點上,x具有沒有價值)

4- ajax請求獲取響應,並將x的值設置爲該響應並將其寫入文檔。

你的問題不是範圍問題,而是時間問題。

0

Ajax異步運行。 JavaScript發出請求並在等待請求完成時繼續執行其他代碼。這意味着當該請求將完成時,您不能依靠,否則即使它將完成,也不能依靠。因此,所有依賴ajax調用結果的工作必須在ajax回調中完成。你根本無法依賴任何發生在ajax回調中的任何事情,這些回調在回調之外對任何事情都有影響。