在预定义函数中访问的全局变量返回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);