2014-09-20 89 views
-1

我有这个简单的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函数中定义。我想从该部分使用它,但因为它稍后定义,它会记录一个未定义的变量错误。有没有解决的办法?

+0

我在上面的演示中的头部提醒 – 2014-09-20 09:28:46

回答

1

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

从您的alert行开始,没有名为publish的变量已创建。如果您尝试读取未申报的符号的值,则会导致ReferenceError。 (如果您尝试不宣符号,在宽松模式下,你得到The Horror of Implicit Globals,在严格模式下你得到的东西理性:一个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 
    } 
); 

如果您需要使用publishapi回调,你会移动的声明到回调之外。但你不能使用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的价值是很重要的。确保从回调中调用它的最佳方法是。

+0

这段代码实际上是非常简化的问题。我需要在头部使用这个变量。这不是一个简单的警报。这只是为了演示 – 2014-09-20 09:55:57

+0

有没有一种方法可以像你提到的那样使用变量,但是在函数之外? – 2014-09-20 10:44:21

+0

@MichaelSamuel:这很奇怪,我没有得到这些评论的通知(系统通常会自动完成)。 **为什么**你需要'head'部分的变量?在“api”回调之外你需要做些什么? – 2014-09-20 11:09:30

1

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

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

实际上,随着OP发布的代码,变量会因[[*隐式全局恐怖*](http://blog.niftysnippets。组织/ 2008/03 /恐怖的隐-globals.html)。这可能不是问题。 (尽管如此,仍然是最好的声明。) – 2014-09-20 09:28:57

+0

对不起,这不起作用 – 2014-09-20 09:52:33