JavaScript变量未设置

时间:2014-05-11 22:08:55

标签: javascript jquery

我有一小段js从ajax中提取一些数据。

solarSystem = "test";

$.getJSON( "ajax/getLocation.php", function( data ) {
      var items = [];
      $.each( data, function( key, val ) {          
            solarSystem = val;          
      });
});

alert(solarSystem);

正在设置val,但如果我将警报放在该功能中,则它不会输出到警报。我认为它与范围有关,但如果有人能指出我正确的方向那么它对js来说是新的。

2 个答案:

答案 0 :(得分:2)

虽然JavaScript是单线程的,但它可以异步执行任务,即函数调用不一定在下一行代码之前完成。 AJAX(异步JavaScript和XML)调用就是这样做的。例如,

console.log("starting")
$.getJSON("path/to/resource", function (data) {
    console.log("data retrieved")
})
console.log("finished")

以上代码很可能在打印starting之前打印finisheddata retrieved。这是因为$.getJSON是异步的。它在某处服务器上请求资源,等待响应,然后调用作为回调提供的匿名函数,即function (data) { /* etc */ }部分。

在您的情况下,回调函数在alert之后运行,即使它在代码中写在它上面。如果您想alert(solarSystem),则需要将其置于$.getJSON来电之内,以确保其处理正确:

solarSystem = "test"

$.getJSON("ajax/getLocation.php", function (data) {
    var items = []
    $.each(data, function (key, val) {          
        solarSystem = val
    })
    alert(solarSystem)
})

答案 1 :(得分:-3)

$ .getJSON中的任何内容都无法在没有对代码进行某些更改的情况下访问任何内容。你需要什么是所谓的回调函数,问题是由于变量作用域。

solarSystem = "test";
function setSolarSystem(newSystem){
    solarSystem = newSystem;
    alert(solarSystem);
}
$.getJSON( "ajax/getLocation.php", function( data ) {
      var items = [];
      $.each( data, function( key, val ) {          
            setSolarSystem(val);          
      });
});