Javascript变量引用/范围问题

时间:2013-11-10 00:04:59

标签: javascript variables scope

我正在设置Google+登录,并且我正在尝试将电子邮件设置为实际获取电子邮件的功能之外的变量,以便我以后可以使用它来创建帐户。但是我在Javascript中遇到了范围问题。当我运行这段代码时(注意这只是代码的一部分),我得到的第一个警告框说“2:asdf”,我得到的第二个警告框说“1:[在这里插入电子邮件]”。我期待得到的是提醒(“2:”+电子邮件);有电子邮件,而不是asdf,但它没有这样做。有什么想法吗?

    var email = "asdf";
    // Get the email
    gapi.client.load('oauth2', 'v2', function()
    {
        gapi.client.oauth2.userinfo.get().execute(function(resp) {
            email = resp.email;
            alert("1: " + email);
        });
    });

    alert("2: " + email);

1 个答案:

答案 0 :(得分:0)

这不是范围问题,这是一个时间问题。

execute方法是异步的,因此您提供给它的回调函数不会立即执行。它将挂起到该函数,并在答案到达后调用它。

呼叫之后的代码将在答案到达之前继续,因此第二个警报将在email变量更改之前运行。然后你的代码块结束,控制权返回给浏览器。在将控件返回到浏览器之前,它无法处理答案到达时触发的事件,这意味着第一个警报永远不会在第二个警报之前到来。

如果要使用答案中的值,则必须在回调函数中执行此操作。由于execute方法是异步的,因此您必须编写代码以异步处理答案。