如何在其他函数的函数下使用javascript中定义的变量。下面是我的确切Javascript代码

时间:2017-02-19 14:57:57

标签: javascript jquery html

var x = document.getElementById("demo");

function getLocation() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(showPosition);
    } else {
        x.innerHTML = "Geolocation is not supported by this browser.";
    }
}

function showPosition(position) {
    lat = position.coords.latitude;
    lon = position.coords.longitude;
    $(".demo").append("Latitude: " + position.coords.latitude +
        "<br>Longitude: " + position.coords.longitude);
}
var gettingJSON = function() {

    $.getJSON("http://api.openweathermap.org/data/2.5/weather?lat=" + lat + "&lon=" + lon + "APPID=4a74787aeb02dcb53dcc8c15e29bdfa1", function(json) {
        $(".para").append(JSON.stringify(json));
    });
}

$(document).ready(function() {
    getLocation();
    gettingJSON();
});

以上是我的代码我收到以下错误

jQuery.Deferred exception: lat is not defined ReferenceError: lat is not defined
    at gettingJSON (file:///G:/WebDev/WeatherAPI/js/main.js:19:73)
    at HTMLDocument.<anonymous> (file:///G:/WebDev/WeatherAPI/js/main.js:26:1)
    at j (file:///G:/WebDev/WeatherAPI/js/jquery.min.js:2:29948)
    at k (file:///G:/WebDev/WeatherAPI/js/jquery.min.js:2:30262) undefined
r.Deferred.exceptionHook @ jquery.min.js:2
k @ jquery.min.js:2
jquery.min.js:2 Uncaught ReferenceError: lat is not defined
    at gettingJSON (main.js:19)
    at HTMLDocument.<anonymous> (main.js:26)
    at j (jquery.min.js:2)
    at k (jquery.min.js:2)
gettingJSON @ main.js:19
(anonymous) @ main.js:26
j @ jquery.min.js:2
k @ jquery.min.js:2

守则不起作用。我试图从showPosition Fucntion中使用lat和lon,但它说lat和lon没有定义。 我没有使用var关键字来制作lat和lon全局变量。 但他们没有工作。请任何人帮助我。

5 个答案:

答案 0 :(得分:0)

如果你想访问这些变量,我建议你从函数中返回它们。或者你可以使用类对象做同样的事情。

答案 1 :(得分:0)

我想我已经找到了问题 -

你的getLocation()函数没有足够快地填充lat和lon, 所以当getJSON()被称为lat时,lon还不存在。

我在这里等了5秒钟进行了测试 -

$(document).ready(function(){
    getLocation();  
    gettingJSON();
    //checking lon and lat immediatelly
    console.log("lon:"+lon+ "lat:"+ lat);
    //setting a 5 sec timeout, and checking the lon and lat value again
    setTimeout(function(){ 
        console.log('waiting');
        console.log("lon:"+lon+ "lat:"+ lat);
        }, 5000); 
});

控制台日志:

lon: undefined lat: undefined
after wait:
lon: 34.99041030000001 lat: 32.7888574

这可能是因为用户不允许足够快地进行位置检查。

也许尝试更改这样的代码:

function showPosition(position) {
  lat=position.coords.latitude;
  lon=position.coords.longitude;
  $(".demo").append("Latitude: " + position.coords.latitude + 
  "<br>Longitude: " + position.coords.longitude); 
  gettingJSON(); //calling gettingJSON here assures that you already have the coordinates
}

答案 2 :(得分:0)

通常,要访问所有函数中的变量,它们应具有全局范围。这意味着它们在函数之外声明。

您的latlon函数在showPosition(position)内部声明。这意味着它们只能由showPosition(position)函数访问,而不能由gettingJSON()函数访问。

如果您在var lat=position.coords.latitude;函数之外和之前声明lon=position.coords.longitude;showPosition(position),它应该有效。

如果您正在使用freecodecamp,这里是一个解释全局和局部变量范围的链接。 FreeCodeCamp: Global ScopeFreeCodeCamp: Local ScopeFreeCodeCamp: Global vs Local Scope

此外,您没有调用showPosition(position)函数,请记住在调整变量声明后执行此操作,如其中一条注释所示

我希望这会有所帮助。

答案 3 :(得分:0)

将所有内容放入自执行函数中,然后在开头声明变量。这样,他们就不是GLOBAL(您通常不想让变量GLOBAL),但他们可以使用代码中的所有内容:

(function($){
  var lat, lon, x;

  function getLocation() {
    if (navigator.geolocation) {
      navigator.geolocation.getCurrentPosition(showPosition);
    } else {
      x.innerHTML = "Geolocation is not supported by this browser.";
    }
  }

  function showPosition(position) {
    lat = position.coords.latitude;
    lon = position.coords.longitude;
    $(".demo").append("Latitude: " + position.coords.latitude +
      "<br>Longitude: " + position.coords.longitude);
  }

  var gettingJSON = function() {
    $.getJSON("http://api.openweathermap.org/data/2.5/weather?lat=" + lat + "&lon=" + lon + "APPID=4a74787aeb02dcb53dcc8c15e29bdfa1", function(json) {
      $(".para").append(JSON.stringify(json));
    });
  }

  $(document).ready(function() {
    x = document.getElementById("demo");
    getLocation();
    gettingJSON();
  });

})(jQuery);

答案 4 :(得分:0)

为了确保获得lat的值,您可以考虑更改程序的结构,并在内部调用gettingJSON showPosition:

var x = document.getElementById("demo");

function getLocation() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(showPosition);
    } else {
        x.innerHTML = "Geolocation is not supported by this browser.";
    }
}

function showPosition(position) {
    lat = position.coords.latitude;
    lon = position.coords.longitude;
    $(".demo").append("Latitude: " + position.coords.latitude +
    "<br>Longitude: " + position.coords.longitude);

    //call gettingJson here, pass it lat, lon values...sure to work if lat,lon is in fact gettting populated.
    gettingJSON(lat, lon);

}
var gettingJSON = function(lat, lon) {

$.getJSON("http://api.openweathermap.org/data/2.5/weather?lat=" + lat + "&lon=" + lon + "APPID=4a74787aeb02dcb53dcc8c15e29bdfa1", function(json) {
    $(".para").append(JSON.stringify(json));
    });
}

$(document).ready(function() {
    getLocation();
});