为什么在以下代码段中无法访问变量值?

时间:2016-05-06 10:59:45

标签: javascript variables scope alert access

我关注了Javascript代码段:

authData=ref.getAuth();

if(authData == null){
    //TODO find an elegant way to manage authorization 
    //  window.location = "../index.html";
} else {
      ref.child("users").child(authData.uid).on("value", function(snapshot){
      $( "span.user-name").html(snapshot.val().displayName);    
      loggedInUser.displayName = snapshot.val().displayName;
      //alert("Name inside : "+loggedInUser.displayName);
      //Here it displays the value      
    });         
}

alert("Nameada is out : "+loggedInUser.displayName);
//Here it shows 'undefined' 

为什么吗

我想使用变量值loggedInUser.displayName我在哪里显示警报。

有人可以帮助我访问该值并显示警告吗?

感谢。

1 个答案:

答案 0 :(得分:4)

当尚未调用回调函数(alert)时,将执行最终的function(snapshot){ ... }。请注意,回调函数是异步调用的,因此只有在当前运行的代码完成且触发value事件后才会执行。

这也解释了为什么内部(注释掉的)alert确实有效。只是意识到这段代码(回调函数)比其他alert稍后执行,即使它出现在代码的前面。

你可以解决"它通过在回调中调用另一个函数,如下所示:

authData=ref.getAuth();

if(authData == null){
    //TODO find an elegant way to manage authorization 
    //  window.location = "../index.html";
} else {
    ref.child("users").child(authData.uid).on("value", function(snapshot){
        $( "span.user-name").html(snapshot.val().displayName);    
        loggedInUser.displayName = snapshot.val().displayName;
        whenUserLogged();
    });         
}

function whenUserLogged() {
   alert("Name : "+loggedInUser.displayName);
   // anything else you want to do....
}

一些改进建议

不要使用too many global variables(在您的代码中,所有这些都是全局的),而是将变量作为函数参数传递。

您可能需要查看promises