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

what's wrong with my scope? Why am I not overwriting the variable? js

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

    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 吗?

这是因为 navigator.geolocation.getCurrentPosition 是异步的并且 console.log(url) 在覆盖 url

的回调函数之前执行

如果您不熟悉 asynchronous 执行,此线程可能会有所帮助:

Asynchronous vs synchronous execution, what does it really mean?

正如 Adam 指出的那样,您试图在 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);
});