在预定义函数内访问的全局变量返回null -javascript

gal*_*ong -1 javascript ajax jquery google-maps scope

出于某种原因,我无法访问变量.可能是范围问题,或时间问题,无法找到它.这是我的简化代码:

var endResult = "";

//function loads html into given element.Called as a callback later when google maps direction service is done//
function getResults(){
  $.ajax({
    url:'foo.php',
    data: endResult,
    //etc., response loaded asynchronously in div element//
  });
}

//when form is submitted
$('#form').submit(function(){
  var endResult = "";
  //get form data, define variable//
  $.post('bar.php',function(data){
    var location = data;
    //initialize Maps Directions Service//
    var directionService = new google.maps.DirectionsService();
    //function gets directions, and loads a single value into global variable "endResult"//
    function calcRoute(){
      var request = {//google maps arguments containing form data//};
      directionsService.route(request, function(result, status) {
        var endResult = JSON.stringify(result.routes[0].legs[0].distance.value);  
        console.log(endResult); //Outputs intended value from google maps//
        //run function as a callback making sure that "endResult" is not null//
        getResults(); //iside this function - value of "endResult" is null, data sent to foo.php is null//
      });
    }
    calcRoute();
  }
  return false;
});
Run Code Online (Sandbox Code Playgroud)

就是这样,一旦我调用了getResults(),在该函数内部,endResult将为null.我确信这很简单,但我无法理解它.

T.J*_*der 6

你没有分配给全局变量,因为你有

    var endResult = "";
//  ^^^
Run Code Online (Sandbox Code Playgroud)

在提交处理程序中,和

    var endResult = JSON.stringify(result.routes[0].legs[0].distance.value);
//  ^^^
Run Code Online (Sandbox Code Playgroud)

...在calcRoute.

那些在这些函数中声明局部变量,这些变量会影响全局变量(阴影中的变量会影响calcRoute提交处理程序中的变量).

只需删除那些var,所以你要分配代码关闭的变量(全局).


通常,避免使用真正的全局变量,并最小化函数具有副作用的程度(例如分配和读取它们关闭的变量).在这种情况下,endResult没有理由calcRoute不能将其getResults作为一个参数传递给全局.