2014-02-11 35 views
0

我一定在做一个基本的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); 
} 

我已经使用稀土作为全局变量尝试和简单地分配给它的功能loadworld(),像这样:

earth = result; 

我还使用返回功能尝试。但是一旦我离开荷载世界,地球总是不确定的。任何想法为什么?

+0

can yoiu show a jsFIddle? – Konza

+0

http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call – Satpal

+0

什么是“地球”应该包含?在将它作为函数参数传递之前,您需要给它一个值。 – Barmar

回答

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(); 
} 
+0

谢谢。我试过了。它似乎没有更好的工作。这个问题似乎与ajax和异步性有关。 –

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); 
    }); 

} 
+0

谢谢。我会与此合作。 –

+0

我以为我通过将async设置为false来避免这种情况,我知道这很难看。但它似乎卡在异步无论如何。 –

+0

没问题))我建议你阅读https://github.com/BonsaiDen/JavaScript-Garden –