2012-05-21 4 views
0

У меня есть два файла (html и js), как показано ниже.невозможно установить переменную для внешнего файла javascript

test.html

<body> 
    <script> 
    /*Loads the fb api*/ 
    window.fbAsyncInit = function() { 
     FB.init({ 
     appId  : '<APP-ID>', 
     status  : true, 
     cookie  : true, 
     xfbml  : true, 
     oauth  : true, 
     }); 
    TimelineScript(); /* function that loads the external javascript */ 
    }; 
    (function(d){ 
     var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;} 
     js = d.createElement('script'); js.id = id; js.async = true; 
     js.src = "//connect.facebook.net/en_US/all.js"; 
     d.getElementsByTagName('head')[0].appendChild(js); 
    }(document)); 

    . . . 
    . . . 
    . . . 

    function TimelineScript(){ 
    FB.getLoginStatus(function(response) { 
    if (response.status === 'connected') { 
     var dt = new Date(); 
     var _testvar = 100;/*Used in the external javascript file*/  

     /*Loading my external javscript*/ 
     (function() { 
      var sa = document.createElement('script'); 
      sa.type = 'text/javascript'; 
      sa.async = true; 
      sa.src = 'http://www.mywebsite.com/javascripts/testing.js?random='+dt.getTime(); 
      var script_tag = document.getElementsByTagName('script')[0]; 
      script_tag.parentNode.insertBefore(sa, script_tag); 

      })(); 

    } else if (response.status === 'not_authorized') { 
     alert("the user is logged in to Facebook, but not auth your app"); 
    } else { 
     alert('user is not logged into fb!'); 
    } 
    }); 
} 

</script> 

    . . . 
    . . . 
    . . . 

    </body> 

testing.js

alert('loaded testing .js'); //works 
alert(_testvar); //throws error 

Оповещение в testing.js файле подбрасывает ошибку _testvar is not defined в консоли Firebug. Предупреждение работает отлично, если у меня есть простой скрипт (без всего кода apik facebook), который просто объявляет переменную, а затем загружает внешние js. Что происходит в этом случае?

ответ

0

Javascript создает новую переменную область для каждой функции, которую вы создаете, будь то анонимная или нет.

Так _testvar в следующем коде является локальным для анонимной функции, и недоступны ничем иным, менее всего другого файла сценария:

function TimelineScript(){ 
    FB.getLoginStatus(function(response) { 
    if (response.status === 'connected') { 
     var dt = new Date(); 
     var _testvar = 100;/*Used in the external javascript file*/  
+0

Thanx! Пойдем, увидишь это! – serpent403

0

Если вы определяете «_testvar» вне функции, он должен работать. Это позволяет переменным использовать во всех областях за пределы только одной функции:

<script> 
var _testvar = 0; 
.... 
function TimelineScript(){ 
FB.getLoginStatus(function(response) { 
    if (response.status === 'connected') { 
     var dt = new Date(); 
     _testvar = 100;/*Used in the external javascript file*/  

     /*Loading my external javscript*/ 
     (function() { 
      var sa = document.createElement('script'); 
      sa.type = 'text/javascript'; 
      sa.async = true; 
      sa.src = 'http://www.mywebsite.com/javascripts/testing.js?random='+dt.getTime(); 
      var script_tag = document.getElementsByTagName('script')[0]; 
      script_tag.parentNode.insertBefore(sa, script_tag); 

     })(); 

    } else if (response.status === 'not_authorized') { 
    alert("the user is logged in to Facebook, but not auth your app"); 
    } else { 
    alert('user is not logged into fb!'); 
    } 
}); 

}

0

Переменная _testvar определяется через FB.getLoginStatus асинхронный (я думаю) call. Итак, время, когда вы тестируете переменную (то есть, сразу), это еще не установлено из-за того, что FB пытается получить статус входа.

Это из-за асинхронный режим; вы можете попытаться установить синхронный режим или проверить _testvar, когда вы получите ответ асинхронизации, а не сразу после кода.

Смежные вопросы