从头部定义的警报变量

时间:2014-09-20 09:20:33

标签: javascript jquery variables

我有这个简单的HTML页面,它使用Facebook Javascript SDK:

<html>
 <head>
 <script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
 <script>
 alert(publish);
 </script>
 </head>

 <body>
 <script type="text/javascript">
 window.fbAsyncInit = function() {
    FB.init({
       appId      : 'xxxxxxxxxxx',
       xfbml      : true,
       version    : 'v2.1'
    });

    FB.getLoginStatus(function(response) {
    });

    FB.api(
       "/me/permissions",
       function (response) {
          if(response && !response.error) {
              publish = '1';
          }
          else {
              publish = '0';
          }
       }
    );

 };
 (function(d, s, id){
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) {return;}
    js = d.createElement(s); js.id = id;
    js.src = "//connect.facebook.net/en_US/sdk.js";
    fjs.parentNode.insertBefore(js, fjs);
 }(document, 'script', 'facebook-jssdk')); 
 </body>
</html>

我想使用在publish函数中定义的名为FB.api的变量。我想从该部分使用它,但因为它稍后定义,它会记录一个未定义的变量错误。有没有解决的办法?

2 个答案:

答案 0 :(得分:1)

您需要在函数启动之前定义变量。然后该函数将更新变量。

<script type="text/javascript">
var publish;

答案 1 :(得分:1)

这里有两个问题,一个声明问题和一个时间问题。

alert行开始,未创建名为publish的变量。如果您尝试读取未声明符号的值,则会导致ReferenceError。 (如果你试图到一个未声明的符号,在松散模式下你得到The Horror of Implicit Globals,在严格模式下你得到一些理性的东西:A ReferenceError。)

但是单独而且更重要的是时间问题:当你试图提醒它时,不仅publish未宣布,而且即使它被宣布它也没有任何有用的价值,因为你还没有设定价值。

警告publish值的正确位置将在您获得值的api回调中:

FB.api(
   "/me/permissions",
   function (response) {
      var publish;                      // <== declare it
      if(response && !response.error) {
          publish = '1';
      }
      else {
          publish = '0';
      }
      alert(publish);                   // <== use it
   }
);

如果您需要在publish回调之外使用api ,您可以将声明移至回调之外。但是,在发生回调之前,您无法使用 publish(有意义)。例如:

var publish; // <======= Declaration
window.fbAsyncInit = function() {
    FB.init({
       appId      : 'xxxxxxxxxxx',
       xfbml      : true,
       version    : 'v2.1'
    });

    FB.getLoginStatus(function(response) {
    });

    FB.api(
       "/me/permissions",
       function (response) {
          if(response && !response.error) {
              publish = '1';               // <=== fill it in
          }
          else {
              publish = '0';               // <===
          }
       }
    );
};

function doSomethingWithItLater() {        // <=== A function that uses it
    if (publish) {
        // Do this
    } else {
        // Do that
    }
}

(function(d, s, id){
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) {return;}
    js = d.createElement(s); js.id = id;
    js.src = "//connect.facebook.net/en_US/sdk.js";
    fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk')); 

重要的是,在调用doSomethingWithItLater回调 之前,您不要致电api,并且您已设置了值publish。确保这一点的最好方法是从回调中调用它。