我必须犯一个基本的javascript错误。我的脚本无法传递变量,我无法弄清楚原因。这是代码,带有注释。
var earth;
function loadWorld(world) {
// loads the world from a Json file using php
$.ajax("loadfile.php", {
dataType: "json",
async: false
}).done(function (result) {
console.log(result);
//Here consul.log provides the expected results, confirming that the file has been loaded into the result.
world = result;
console.log(world);
//Here too, properly transferred into world.
});
};
function button1() {
loadWorld(earth);
console.log(earth);
//But here console.log tells me earth is undefined!
showData(earth);
}
我尝试使用earth作为全局变量,只需在函数loadworld()中分配它,就像这样:
earth = result;
我也尝试过使用return函数。但是一旦我离开了loadworld,地球总是不确定的。有什么想法吗?
答案 0 :(得分:1)
由于异步,它不起作用。您的最后一个console.log在您的ajax请求调用完成回调之前调用。最佳解决方案是使用回调
function loadWorld(world, success) {
$.ajax( "loadfile.php", {dataType: "json", async: false} )
.done(function (result) {
if(success) success(result);
});
};
function button1 () {
loadWorld(earth, function(result){
//your callback logic
console.log(result)
showData(result);
});
}
答案 1 :(得分:0)
(编辑:正如其他地方所述,你也有一个AJAX调用的问题,不一定要在你的函数返回之前完成。)
问题是JavaScript并没有真正传递引用。它有效地传递了引用的副本。这意味着如果将现有对象传递给函数,则可以在本地对其进行更改,这将影响原始对象。但是,如果您完全覆盖变量(通过为其指定新对象),原始文件将不受影响。
在您的情况下,您将结果分配到world
。所有这一切都会影响本地world
变量;它不会覆盖earth
。
有关详细信息,请参阅此问题:Is JavaScript a pass-by-reference or pass-by-value language?
更好的方法是这样的:
var earth;
function loadWorld()
{
// (loading code here...)
return result;
}
function button1()
{
earth = loadWorld();
}