从头部定义的警报变量

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

    alert(publish);     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'));   

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

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

alert行开始,没有创建名为publish变量。 如果您尝试读取未声明符号的值,则会导致ReferenceError 。 (如果你试图一个未声明的符号,在松散模式下你会得到隐含全局的恐怖 ,在严格模式下你得到一些理性的东西:一个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 } ); 

如果需要在api回调之外使用publish ,则可以将声明移到回调之外。 但是,在发生回调之前,您无法使用 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')); 

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

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