变量未定义在javascript中

时间:2016-02-07 14:21:30

标签: javascript google-maps latitude-longitude

我对此问题感到困惑。请看看我的代码。 当函数提示时它表示没有定义lon和lat。 我在debuger中观察selectLat,selectLon,param,但前两个变量具有正确的属性,尽管param.lat和param.lon未定义。 他们怎么了?

var selectLat,selectLon;

function showCurrent(s){

if(navigator.geolocation){

    navigator.geolocation.getCurrentPosition(s);
   }

}

function passLatLon(currentPos){
selectLat=currentPos.coords.latitude;
selectLon=currentPos.coords.longitude;

}
<script>
showCurrent(passLatLon);

var param={

lat:selectLat,
lon:selectLon,
};

function getResults(param, function(data){
alert(JSON.stringify(data));
}

3 个答案:

答案 0 :(得分:1)

也许试试这个:

   function showCurrent(s){
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(s);
        } else {
            console.log("Geolocation is not supported by this browser.");
        }      
    }

    function passLatLon(currentPos){
        var param = {
                selectLat:currentPos.coords.latitude,
                selectLon:currentPos.coords.longitude
            }
        getResults(param); //getResults() : You never called this
    }

    function getResults(data){
        alert(JSON.stringify(data));
    }

    showCurrent(passLatLon);     

由于

答案 1 :(得分:0)

您获得的错误:您在创建selectLat之前设置了lat:selectLat。

编辑:另请注意:lon:selectLon末尾的逗号会生成语法错误。

主要的是:您正在使用需要时间执行的代码。在使用变量之前,必须等到服务准备就绪。

这可能就像你想要的那样。

<script>
var selectLat, selectLon, param;

// requests a position tracking
function showCurrent(successCallback) {
  if(navigator.geolocation){
    navigator.geolocation.getCurrentPosition(successCallback);
  }
}

// callback.  This function gets triggered when the position was found
function passLatLon(currentPos) {
  selectLat=currentPos.coords.latitude;
  selectLon=currentPos.coords.longitude;
  // only now we can set var param
  param = {
    lat: selectLat,
    lon: selectLon
  };
  getResults(param);
}

// request position tracking
showCurrent(passLatLon);

function getResults(data) {
  alert(JSON.stringify(data));
}
</script>
编辑:与Rizo大致相同的事情发生在同一时间

答案 2 :(得分:0)

定义时:

void loadFile(const char* fn)
{
    std::ifstream fin(fn);
    if(!fin.good())
        throw std::runtime_error("File could not be opened.");
    std::string code(std::istreambuf_iterator<char>(fin), std::istreambuf_iterator<char>());
    fin.close();
    std::string test = "test";
    loadString(test.c_str());
}

... var param={ lat:selectLat, lon:selectLon, }; latselectLatlon成对绑定,您只需指定当前selectLon / {{1 } {value(在selectLat声明时未定义)到selectLon / param属性。

可以绑定它们(例如,通过lat),但这可能不是你想要的,真的。相反,尝试完全删除lon / Object.defineProperty变量,如下所示:

selectLat

修改

selectLon对象的属性永远不会更改,因为它们实际上绑定var param = { lat: 0, lon: 0, }; function passLatLon(currentPos){ param.lat = currentPos.coords.latitude; param.lon = currentPos.coords.longitude; } / param变量,因此,只要{{1 }} / selectLat变量已更改,不会影响selectLon个对象。

您必须直接将selectLat属性更改为@Rize并建议,或者通过某些变通方法将其绑定到selectLon / param并在您的模型上触发param事件手动

另一个可能的原因:selectLat是异步的,所以在调用selectLon坐标仍然未解析后,因此change / getCurrentPosition()未设置({{1}正如他们所声明的那样)。这就是为什么在第一次打电话给showCurrent(passLatLon)之后他们会selectLat,在第二次之后 - 他们将价值保留在之前的通话中,依此类推:

selectLon