2

У меня есть переменные, которые я устанавливаю с помощью функции. Когда внутри функции я могу получить, установить и предупредить 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 
+0

Для будущих читателей я предлагаю отредактировать этот вопрос, чтобы отразить, что переменные установлены внутри функции обратного вызова. Как написано, похоже, что переменная scope - единственная проблема. Область переменных является одним из двух вопросов, имеющих отношение к этому вопросу. –

ответ

3

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

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); 

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

+0

Это не сработает, потому что значение uid1 не будет заполнено при запуске предупреждения. – jfriend00

+0

@ jfriend00 значения не будут установлены, но он исправляет «неопределенную» проблему, так как в переменных будут существовать. –

+0

Мне нужны значения, которые нужно установить – Autolycus

-2

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

+2

Ответы Snarky на самом деле не помогают –

1

Переменные в Javascript имеют область действия. Это означает, что они существуют только в функции, которую они объявляют с помощью ключевого слова 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

Это не сработает, потому что значение uid1 не будет заполнено при запуске предупреждения. – jfriend00

+0

@ jfriend00 Является ли 'FB.getLoginStatus' асинхронным? – Paulpro

+0

Да, FB.getLoginStatus может быть асинхронным (иногда результат кэшируется). Вот почему он требует обратного вызова. Если бы это было не async, они бы просто вернули результат, а не использовали обратный вызов. – jfriend00

2

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

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

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

+0

+1 «Проблема здесь не просто в переменном объеме» –

Смежные вопросы