почему эта функция не возвращает какие-либо значения? - PullRequest
1 голос
/ 07 декабря 2011

Мне нужно передать переменные в другую функцию, но она ничего не возвращает.ПРИМЕЧАНИЕ: он ничего не возвращает наружу, но если я делаю 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>

Ответы [ 5 ]

9 голосов
/ 07 декабря 2011

Вы неправильно понимаете несколько понятий.

Во-первых, return (a, b) оценивается как return b.Запятая почти не нужна.Если вы хотите вернуть массив, используйте return [a, b].

Во-вторых, getCurrentPosition является асинхронным.Он выполнит Location, если найдет позицию.Поэтому, когда вы вызываете document.write, позиция еще не выбрана.

Наконец, вы вообще не используете возвращаемое значение.Если вы хотите использовать возвращаемое значение функции, используйте, например, var result = func(...).Тем не менее, в этом случае это не имеет смысла.

Я точно не знаю, что вы ищете, но все, что зависит от позиции, должно быть помещено внутри обратного вызова (Location в этом случае).Только когда обратный вызов вызван, доступно решение.В этом обратном вызове возвращать что-то бессмысленно, поскольку возвращаемое значение не используется для 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
}
2 голосов
/ 07 декабря 2011

Функция .getCurrentPosition() выполняется асинхронно, а затем вызывает Location() после завершения.Между тем, все, что придет после вызова getCurrentPosition(), будет выполнено, но не будет иметь результатов для работы.Это также означает, что все, что вы вернете из Location(), не будет использоваться никаким другим кодом.

Так что вам нужно вызывать другую функцию из Location().

(Также говорим офункция возвращает в общем случае, вам нужно вернуть одно значение или объект / массив. Список возвращаемых значений через запятую, по сути, просто вернет последнее в списке.)

2 голосов
/ 07 декабря 2011

Попробуйте изменить свой код на это:

<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(), будет выполнена при получении позиции. Только тогда у вас есть доступ к позиции, и вы можете установить latitude и longitude переменные и записать их в документ.

В вашем коде будет вызываться getCurrentPosition(), затем сразу после этого будет выполнено document.write(latitude,longitude);, что намного раньше, чем станут доступны latitude и longitude. Вы должны переместить 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);

См. это для полного кода.

2 голосов
/ 07 декабря 2011

Вы можете вернуть только одно значение из функции. Если вы хотите вернуть более одного значения, создайте объект и установите значения в нем для возврата. В противном случае используйте массивы для возврата более одного значения

1 голос
/ 07 декабря 2011

navigator.geolocation.getCurrentPosition вызывает переданную функцию асинхронно, как только позиция становится доступной (например, после того, как пользователь принял запрос, если сайт может знать позицию).

Вам необходимо продолжить свой код в функции Location и ничего не возвращать, так как он нигде не будет использоваться.

...