代码之家  ›  专栏  ›  技术社区  ›  Rich Bradshaw

javascript中的变量范围

  •  2
  • Rich Bradshaw  · 技术社区  · 15 年前

    这是一个简单的问题,但我解不出来。

    细节并不重要,但要点如下。我有一些这样的代码:

    var lat = 0;
    var lon = 0;
    
    if (navigator.geolocation) {    
        navigator.geolocation.getCurrentPosition(function(position) {
            lat = position.coords.latitude;
            lon = position.coords.longitude;
        });
    }
    

    我认为它所做的是:

    1. 将lat和lon设置为0
    2. 如果浏览器具有地理位置,请用实际值覆盖这些变量。

    然而,在该块的末尾,lat和lon仍然是0。我试着补充 var 将lat和lon传递给函数等,但没有成功…

    我该怎么做?

    3 回复  |  直到 15 年前
        1
  •  6
  •   Community CDub    8 年前

    这是一个异步回调。基本上,您将一个函数传递给导航器API。然后,您的代码继续(并做任何事情)。稍后,导航器API使用应答(位置)调用回调。因此,任何使用位置的东西都必须在回调内部(包括由回调调用)。

    也见 this previous answer 显示如何创建和使用包装函数。

    编辑:您可以简单地编写一个调用回调的函数,不管它是什么。如果需要,getlocation可以将另一个标志传递给它的参数(例如失败/成功代码)。

    function getLocation(callback)
    {
        if (navigator.geolocation) {    
            navigator.geolocation.getCurrentPosition(callback);
        }
        else {
            callback(null);
        }
    }
    

    然后:

    getLocation(function(pos)
    {
      //do stuff
      if(pos != null)
      {
        // loc stuff
      }
      // more stuff
    });
    

    您不必使用匿名函数。

        2
  •  2
  •   kennytm    15 年前

    这与范围无关。 getCurrentPosition 异步调用,这意味着它将在收到位置之前立即返回。这个 function(position) 仅当实际接收到地理位置时调用。

        3
  •  1
  •   Amarghosh    15 年前

    getCurrentPosition() 是异步的-值不会立即更新。

    这个 getCurrentPosition() 方法接受一个、两个或三个参数。调用时,它必须立即返回,然后异步尝试获取设备的当前位置。如果尝试成功,则 successCallback 必须调用(即 handleEvent 必须使用反映设备当前位置的新位置对象对回调对象调用操作)。如果尝试失败, errorCallback 必须用新的 PositionError 对象,反映失败的原因。

    alert 函数中的值,您将看到这些更改。编写代码以在函数内部执行您想要的任何操作(或将它们抽象到另一个函数并从中调用),而不是在 if 块。为了安全起见,还添加了一个错误回调。