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

时间:2017-07-17 13:30:57

标签: 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: 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。我确定它很简单,但我无法理解它。

2 个答案:

答案 0 :(得分:6)

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

    var endResult = "";
//  ^^^
提交处理程序中的

    var endResult = JSON.stringify(result.routes[0].legs[0].distance.value);
//  ^^^

...在calcRoute

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

只需移除那些var,即可分配代码关闭的变量(全局)。

通常,避免使用真正的全局变量,并尽量减少函数具有副作用的程度(例如分配和读取它们关闭的变量)。在这种情况下,endResult无法将calcRoute作为参数传递给getResults,而不是csrutil status为全局。

答案 1 :(得分:1)

您应该将该函数中的该变量作为参数传递。

getResults(endResult);

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