2014-09-20 91 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