无法传递变量

时间:2014-02-11 11:25:14

标签: javascript jquery

我必须犯一个基本的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,地球总是不确定的。有什么想法吗?

2 个答案:

答案 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();
}