2011-12-07 17 views
1

私は変数を別の関数に渡す必要がありますが、何も返さないのです。 注:それは外に何も返さdoesntのが、私は関数内のdocument.writeをすれば、それは完璧に動作します。..なぜこの関数は値を返さないのですか?

<script type="text/javascript"> 
//funtion1 
    if (navigator.geolocation){ 
     navigator.geolocation.getCurrentPosition(Location); 
     } 
    function Location(position){ 
     var latitude = position.coords.latitude; 
     var longitude = position.coords.longitude; 
    return (latitude,longitude); 
     } 


//function2 
    function initialize() { 
     document.write(latitude); 
     document.write(longitude);} 
</script> 
+0

私はそれを呼んでいないことを知っていますが、それでも動作します!値を出力していません。 – jony

+2

深いところでジャンプして、言語のもっとも単純な概念を踏まずに何かをしようとするのではなく、いくつかの基本的なJavaScriptチュートリアルを読むことをお勧めします。 –

答えて

2

あなたは関数から一つの値だけを返すことができます。複数の値を返す場合は、オブジェクトを作成し、その値を返すように設定します。それ以外の場合は配列を使用して複数の値を返します

9

いくつかの概念を誤解しています。

まず、return (a, b)は、return bと評価されます。コンマ演算子はほとんど必要ありません。配列を返す場合は、return [a, b]を使用します。

第2に、getCurrentPositionは非同期です。位置が見つかった場合はLocationを実行します。従って、あなたがdocument.writeと呼んだとき、その位置はまだ取り出されていません。

最後に、戻り値をまったく使用していません。関数の戻り値を使用する場合は、例を使用します。 var result = func(...)。しかし、この場合、これは意味をなさない。

私はあなたが何をしているのか正確には分かりませんが、その位置に依存するものはコールバック(この場合はLocation)に入れてください。コールバックが呼び出されたときだけ、poisionが利用可能です。戻り値がgetCurrentPositionのために使用されないので、何かを返すこのコールバックでは無意味です。

編集:あなたのコードを見ると、あなたが代わりにreturn INGのこのような何かをしたい:ユーザーが受け入れられた後

function Location(position) { 
    var latitude = position.coords.latitude; 
    var longitude = position.coords.longitude; 

    useValuesForSomethingElse(latitude, longitude); // call other function with position data 
} 
+0

返すことについての頭のおかげで、(a、b) – jony

1

navigator.geolocation.getCurrentPositionが非同期とすぐに位置が例えば(利用可能であるとして渡された関数を呼び出しますサイトがその位置を知っているかどうかを尋ねるプロンプト)。

Location関数でコードを続行する必要があります。どこでも使用されないため、何も返しません。

+0

私はfunction1の中にfunction2を入れることを余儀なくされているので、値を出力できないようです。私のコードははるかに厚く重くなるでしょう。 – jony

+0

これはまさにあなたが**すべきことです**あなたは別の関数を呼び出して、それにパラメータを渡すことができます。 – ThiefMaster

2

は、このにあなたのコードを変更してください:

<script type="text/javascript"> 
    if (navigator.geolocation) { 
    navigator.geolocation.getCurrentPosition(function(position) { 
     var latitude = position.coords.latitude; 
     var longitude = position.coords.longitude; 
     document.write(latitude, longitude); 
    }); 
    } 
</script> 

位置が取得されたときにgetCurrentPosition()に渡す関数が実行されます。それだけでポジションにアクセスすることができ、latitudelongitudeという変数を設定し、それらをドキュメントに書き込むことができます。あなたのコードgetCurrentPosition()

は、その後すぐにそのdocument.write(latitude,longitude);が実行されます後に道latitudelongitude利用可能になる前である、呼び出されます。 document.write()Location()に移動する必要があります。

アップデート1(コメントに基づいて):

あなたは、コールバック関数内document.write()を行うにはしたくないが、あなたは別の関数を呼び出したい場合は、あなたがコールバック関数からそれを呼び出す必要があります。

それは次のようになります。

<script type="text/javascript"> 
    if (navigator.geolocation) { 
    navigator.geolocation.getCurrentPosition(function(position) { 
     var latitude = position.coords.latitude; 
     var longitude = position.coords.longitude; 
     myFunction(latitude, longitude); 
    }); 
    } 

    function myFunction(latitude, longitude) { 
    // you can do here anything you wish 
    document.write(latitude, longitude); 
    } 
</script> 

アップデート2(コメントや更新の質問に基づいて):

を位置に基づいてマップをロード処理する仕方を呼び出すためにすることですinitialize()Location()latitudeおよびlongitudeをパラメータとする。ページがロードされたときにHTML要素で動作するコードが実行されるようにするには、Location()の内部で実行できます。

window.onload = intialize(latitude, longitude); 

完全なコードのためにthisを参照してください。

+0

私が望むのは、関数内でdocument.write()を実行しないことです! 値を取得して別のファンクションで使用したい – jony

+0

@jony:私は自分の答えを更新しました。 – kubetz

+0

ありがとう、それはちょうど私が欲しかった、それはすぐに病気をテストしているようですね! – jony

2

.getCurrentPosition()関数は非同期に実行され、完了するとLocation()が呼び出されます。その間に、getCurrentPosition()への呼び出しの後に来るものは実行されますが、動作する結果はありません。つまり、Location()から返ったものは、他のコードでは使用されません。

Location()から他の機能を呼び出す必要があります。

(また、一般的には関数が戻るの話、あなたは、単一の値またはオブジェクト/配列を返す必要があります。戻り値のカンマ区切りリストが有効でちょうどリストの最後の1が返されます。)

関連する問題