出于某种原因,我无法访问变量。可能是范围问题或时间问题,无法找到它。这是我的简化代码:
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。我确定它很简单,但我无法理解它。
答案 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
。如果这样做,它将再次声明为局部变量,并将仅限于该函数的范围。