我有一些变量,我正在设置一个函数。在函数内部,我可以获取,设置并提醒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 :(得分: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(以及所有编程语言曾)具有范围吗?