2012-10-23 177 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调用的成功处理程序中。

相关问题