我的范围有什么问题?为什么我不覆盖变量? JS

时间:2017-02-15 01:49:59

标签: javascript function variables scope overwrite

我正在尝试覆盖变量但不知何故它不起作用。 我在这里做错了什么?

    var url = 'BB';

    navigator.geolocation.getCurrentPosition(function (position) {
        url = 'http://maps.googleapis.com/maps/api/geocode/json?latlng=' + position.coords.latitude.toString() + ',' + position.coords.longitude.toString();
    });

    console.log(url);

我的url不应该获取整个字符串而不是输出bb吗?

2 个答案:

答案 0 :(得分:4)

这是因为Feb 15 10:12:52 xxx dockerd[7596]: time="2017-02-15T10:12:52.456651320+09:00" level=debug msg="Calling POST /containers/create" Feb 15 10:12:52 xxx dockerd[7596]: time="2017-02-15T10:12:52.456886794+09:00" level=debug msg="form data: {\"AttachStdin\":true,... 是异步的,navigator.geolocation.getCurrentPosition在你覆盖url的回调函数之前被执行

如果您不熟悉console.log(url)执行:

,此主题可能会有所帮助

Asynchronous vs synchronous execution, what does it really mean?

答案 1 :(得分:0)

正如亚当指出的那样,您在为url变量分配值之前尝试使用'BB'变量(除了您初始化它的url之外)。

除非你有充分的理由让url变量全局化并理解异步代码的问题,否则最好不要在回调之外 声明这个变量。这会导致您遇到的麻烦。

相反,在回调中将navigator.geolocation.getCurrentPosition(function (position) { var url = 'http://maps.googleapis.com/maps/api/geocode/json?latlng=' + position.coords.latitude.toString() + ',' + position.coords.longitude.toString(); console.log(url); }); 声明放在您指定的位置。然后在回调中或在回调内部调用的函数中做任何你需要做的事情。不要试图将它用作全局变量。

例如,这可以解决您遇到的问题:

LOC_Os04g47290
LOC_Os04g53190,LOC_Os04g53195
LOC_Os09g20260