为什么我的变量在回调函数之外未定义?

时间:2012-02-27 02:18:00

标签: javascript jquery javascript-events facebook-javascript-sdk

我有一些变量,我正在设置一个函数。在函数内部,我可以获取,设置并提醒uid1accessToken2,但如果我尝试在函数之外提醒他们,则会给出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 个答案:

答案 0 :(得分: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);

更新:根据以下评论的建议,由于您的getLoginStatus方法是异步的,因此当您在方法外调用alert()时,可能没有值。我在回调中添加了其他警报,以显示您应该尝试访问这些值的位置。

答案 1 :(得分:2)

似乎您正在考虑您的代码,就好像回调函数在

之前执行一样
alert(uid1); //does NOT work here
alert(accessToken2); 

由于FB.getLoginStatus可能是异步的,因此情况并非如此。它将立即返回并继续发送警报。这里的问题不仅仅是变量范围。问题是,在执行回调之前,您无权访问要显示的信息。你无法通过移动变量声明来编程。你必须在你的程序/网站/其他任何设计中适应这个现实。

答案 2 :(得分:1)

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

答案 3 :(得分:-3)

因为JavaScript(以及所有编程语言)具有范围吗?