2012-10-23 142 views
0

我想克隆一個JSON對象內的函數想要訪問函數外的對象。但是當函數完成時,對象似乎仍然是未定義的。似乎它不是同一個變量?修改一個函數內部的全局JavaScript變量

var jsonUserObj; 
$.getJSON("user.json", function(content){ 
    jsonUserObj = $.parseJSON(JSON.stringify(content)); 
    console.log(content); 
    console.log(jsonUserObj); //looks fine! 
}); 
console.log(jsonUserObj); //undefined 

裏面的回調函數裏面包含了所有的數據,但它並不保留在它之外。如何使其全球可評估?

+0

'getJSON'是異步的。 – sje397

+4

Typo:'jsonUserObject'!=='jsonUserObj'這就是'undefined'的原因。但是,異步調用會在getJSON()調用之後立即查看它時導致它不具有新值。 –

回答

0

您需要在函數外聲明var jsonUserObj

此外它看起來像你有一個typeo,它是jsonUserObj或jsonUserObject?

+0

嗯,這是第一行... –

+0

對,但是他在哪裏調用get?它需要從某個地方調用,我假設整個塊包含在另一個函數中 – Maess

+0

雖然沒有關係 - 它仍然在比getJSON()調用更高的範圍內聲明,所以即使整個東西被包裝在函數範圍將仍然適用於此示例。 –

2

$ .getJSON是異步的CONSOLE.LOG在你的代碼的運行結束$ .getJSON返回其結果之前。

您應該修改回調中的變量(其中看起來很好),然後使用該函數內部的變量,此回調是您可以保證設置變量的唯一位置。

你也可以使用$ .ajax的同步版本,但這真的不推薦(也可能不需要)。

+0

嗯。我可以做到這一點,但想避免它。不管怎麼說,還是要謝謝你 – user1768443

0

難道這是一個時間問題嗎?如果getJSON方法異步觸發,那麼在您觸發最後一行時,它可能沒有返回它的值。那有意義嗎?

0

$.getJSON執行異步的ajax調用。它後面的代碼將在等待響應時繼續評估。當響應返回時,程序流將跳回到ajax調用的成功/錯誤/完整處理程序中。

tldr:您對ajax調用的數據所做的任何操作都必須位於該ajax調用的成功處理程序中。

相關問題