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

在预定义函数中访问的全局变量返回null-javascript,javascript,jquery,ajax,google-maps,scope,Javascript,Jquery,Ajax,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: endRes

由于某种原因,我无法访问变量。可能是范围问题,或者是时间问题,我找不到。以下是我的简化代码:

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

就是这样,一旦调用getResults,在该函数中,endResult将为null。我确信这是件简单的事,但我无法理解

应该将该变量作为参数传递到该函数中

getResults(endResult);

您应该避免在表单提交函数中使用var。如果您这样做,它将再次声明为局部变量,并且将被限制在该函数的范围内。

您没有分配给全局变量,因为您已经

    var endResult = "";
//  ^^^
在提交处理程序中,以及

    var endResult = JSON.stringify(result.routes[0].legs[0].distance.value);
//  ^^^
…在卡尔克劳特

这些函数在这些函数中声明局部变量,这些局部变量隐藏全局变量,而calcRoute中的局部变量隐藏提交处理程序中的局部变量

只需删除这些变量,就可以为代码在全局范围内关闭的变量赋值


一般来说,避免使用真正的全局变量,并尽量减少函数的副作用程度,如分配和读取它们关闭的变量。在这种情况下,calcRoute没有理由不将其作为参数传递给getResults,而不是将endResult作为全局变量。

可能是这样,但它没有回答为什么不设置全局变量的问题。当您再次将变量与var一起使用时,然后它将再次声明,然后它将不再是全局变量。仅第一次全局声明endResult。。在这之后,您不需要编写var,因为您每次都会声明它是新的。您似乎有在为变量赋值时使用var的习惯。var声明了一个变量。分配给现有变量时不使用它。感谢您的澄清,它现在可以工作了。我觉得有点傻,但毕竟我们就是这样学习的。谢谢,干杯!
getResults(endResult);