Почему мои переменные не определены вне функции обратного вызова? - PullRequest
2 голосов
/ 27 февраля 2012

У меня есть некоторые переменные, которые я устанавливаю с помощью функции. Находясь внутри функции, я могу получить, установить и предупредить uid1 и accessToken2, но если я попытаюсь предупредить их за пределами функции, она выдаст undefined. Как я могу установить значения?

Вот код:

FB.getLoginStatus(function(response) {
    if (response.status === 'connected') {
        var uid1 = response.authResponse.userID;
        alert(uid1); //works here
        var accessToken2 = response.authResponse.accessToken;
        alert(accessToken2); //works here
    } 
    else if (response.status === 'not_authorized') { } 
    else { }
});

alert(uid1); //does NOT work here
alert(accessToken2); //does NOT work here

Ответы [ 4 ]

3 голосов
/ 27 февраля 2012

Вы объявили эти переменные вне области их использования. Чтобы исправить ваш код, объявите их вне функции:

var uid1 = "";
var accessToken2 = "";
FB.getLoginStatus(function(response) {
    if (response.status === 'connected') {
        uid1 = response.authResponse.userID;
        alert(uid1);
        accessToken2 = response.authResponse.accessToken;
        alert(accessToken2);
    } else if (response.status === 'not_authorized') {

    } else {

    }

    alert(uid1); // Values will be set here.
    alert(accessToken2);
});
alert(uid1); // Values won't reliably be set here.
alert(accessToken2);

Обновление: Как следует из приведенных ниже комментариев, поскольку ваш метод getLoginStatus является асинхронным, вы, скорее всего, не получите значений при вызове alert() вне метода. Я добавил дополнительные предупреждения в обратный вызов, чтобы показать, где вы должны попытаться получить доступ к значениям.

2 голосов
/ 27 февраля 2012

Кажется, вы думаете о своем коде, как будто функция обратного вызова выполняется до

alert(uid1); //does NOT work here
alert(accessToken2); 

Поскольку FB.getLoginStatus может быть асинхронным, это не так. Он вернется и сразу же продолжит ваши оповещения. Проблема здесь не только в переменной области. Проблема в том, что у вас нет доступа к информации, которую вы хотите отобразить, пока не будет выполнен обратный вызов. Вы не можете запрограммировать свой выход, перемещая объявление переменной. Вы должны учесть этот факт реальности в своем дизайне программы / веб-сайта / чего угодно.

1 голос
/ 27 февраля 2012

Переменные в Javascript имеют область действия функции.Это означает, что они существуют только в функции, в которой они объявлены с ключевым словом var, если они не являются глобальными переменными.Удалите ключевое слово var из вашей функции, но чтобы не сделать его глобальным, включите его в другую функцию, подобную этой:

(function(){
    var uid1, accessToken2;
    FB.getLoginStatus(function(response) {
          if (response.status === 'connected') {
            uid1 = response.authResponse.userID;
          alert(uid1); works here
            accessToken2 = response.authResponse.accessToken;
            alert(accessToken2); //works here
          } else if (response.status === 'not_authorized') {

          } else {

          }
         });
    alert(uid1);  //uid1 declared but not set until callback executes
    alert(accessToken2); //accessToken2 declared but not set until callback executes
    // these alerts will likely NOT display the information
    // they are intended to display because of asynchronous callback 
})();

alert(uid1);  //uid1 is not declared, so this doesn't work
alert(accessToken2); //accessToken2 is not declared, so this doesn't work
0 голосов
/ 27 февраля 2012

Поскольку JavaScript (наряду со всеми языками программирования когда-либо ) имеет область действия?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...