2012-07-11 124 views
1

我试图检索分离函数的2个属性,我调试那里的值在函数结束之前,他们有一个值,但返回值alwas未定义我不知道为什么!javascript的返回值总是未定义

的js文件

function STAAPlanlat(){ 
    alert ("the function"); 

    if (navigator.geolocation) { 
    //we supposed to call the handlers of the expections 
    navigator.geolocation.watchPosition(function(position) { 
     alert("show position "); 
    // x.innerHTML="Latitude: " + position.coords.latitude +"<br />Longitude: " + position.coords.longitude; 
     var lat=position.coords.latitude; 
     var lan=position.coords.longitude;  

     //x.innnerHTML=out 
     alert(lat+"<"+lan); 
     return lan; 
    }); 

    } else { 
    alert("error"); 
    } 
} 

我得到了警报,局域网的值和纬度

但是当我呼吁分离文件时,它返回undefined返回值

<!DOCTYPE html> 
<html> 
<head> 
    <script type="text/javascript" src="STAAP1.2.js"> </script> 

<script type="text/javascript"> 
    function test(){ 
    var out=STAAPlanlat();  
    document.getElementById("STAAPlanlat").value = "lan is"+out; 
    //document.writeln("lan is"+out); 
    } 
    </script> 
</head> 
<body> 
<p id="STAAPlanlat">Test the division</p> 
<button onclick="test()">STAAPlanlat()</button> 
<button onClick="alertme()" >Alert</button> 

</body> 
</html> 

回答

2

因为你没有从主函数返回它,所以你从嵌入的匿名函数返回它,它没有做任何事情。这样做:

function STAAPlanlat(){ 
var lat; 
var lan; 
alert ("the function"); 
if (navigator.geolocation) { 
    //we supposed to call the handlers of the expections 
    navigator.geolocation.watchPosition(function(position) { 
     alert("show position "); 
     // x.innerHTML="Latitude: " + position.coords.latitude +"<br />Longitude: " + position.coords.longitude; 
     lat=position.coords.latitude; 
     lan=position.coords.longitude; 

     //x.innnerHTML=out 
     alert(lat+"<"+lan); 
    }); 
    return lan; 
} 
else 
    alert("error"); 
} 
+0

非常感谢,现在的工作,很高兴你:) @jeschafe – 2012-07-11 21:50:23

+0

这个答案帮助比其他任何我多,谢谢大家!我没有意识到从嵌入函数返回值,在这种情况下,ajax成功函数并没有将它返回到主函数以供在外部使用。 – 2018-02-07 11:08:17

0

因为函数STAAPlanlat不返回任何值。您的匿名函数返回lan,但它是异步回调。 return lan;前补充一点:

document.getElementById("STAAPlanlat").value = "lan is" + lan; 
+0

非常感谢:)我会用它来测试值:)谢谢 – 2012-07-11 21:50:59

3

您在匿名函数返回并且这个值是从来没有分配到任何东西。你可以用回调做你想做的事。

// untested code, hope it works 
function STAAPlanlat(callback){ 
    alert ("the function"); 
    if (navigator.geolocation) { 
     navigator.geolocation.watchPosition(function(position) { 
      var lat=position.coords.latitude; 
      var lan=position.coords.longitude; 
      callback(lat, lan); 
     }); 
    } 
    else{ 
     alert("error"); 
    } 
} 

而且你的测试功能...

function test(){ 
    var out; 
    STAAPlanlat(function(lat, lon) { out = lat; }); 
} 
+0

非常感谢:)它适用于我,但我有一个旅行时使用'/ /警报(“出是”+出); \t document.writeln(“lan is”+ out);'它是未定义的,但是当我发出警报时,它返回值'alert(“out is”+ out); \t document.writeln(“lan is”+ out);'''我认为我需要延迟计时器,非常感谢很多:) @iurisilvio – 2012-07-11 21:47:10

+1

时间延迟不是一个好主意。你应该准备一个回调函数,它用lat和lng来做你想要的。即 'STAAPlanlat(函数(lat,lon){alert('lat ='lat); document.write('lng ='+ lon)});' – jagm 2012-07-12 07:11:48

+0

准确地说,你可以用定时器来做,但它是不是一个好主意。改变我在代码中定义的回调来完成你所需要的,就像@jagm所说的那样。 – iurisilvio 2012-07-12 12:29:40