2012-01-12 93 views
1

好吧,所以我有一個js對象聲明在我的js文件的頂部,並在底部我有一個功能,正在創建一個屬性並添加一個值,但是當我去控制檯日誌在不同的功能,則返回undefined,但如果我登錄整個對象時,它顯示了對象,並低於其價值的新特性新特性是代碼:JavaScript的對象屬性日誌undefined

$(document).ready(function(){ 
var allVars={}; 
contentJson(); 
bioPageClass(); 


//start bioPage code. 
function bioPageClass(){ 
    console.log(allVars.nums) 
    //allVars.bioContent=allVars.allContent.theComittee.bios; 
    allVars.timeTxt=allVars.allContent.theComittee.timeline; 
    mouseEx(); 
    bioInfo(0); 
    $('#next').click(function(){ 
       var itsindex = inkDot($('.dot').index($('.filled'))+1); 

      }); 

      $('#pre').click(function(){ 
       var itsindex2 = inkDot($('.dot').index($('.filled'))-1); 

      }); 

      function inkDot(dots){ 

       $('.dot').removeClass('filled'); 
       var equalize = dots < 0 ? 0 : dots; 

       if(equalize <= $('.dot').length -1){ 
       $('.dot:eq('+equalize+')').addClass('filled'); 
       console.log('1st if '+equalize); 
       bioInfo(equalize); 
       }else{ 
        equalize=0; 
        console.log('the else '+equalize); 
        $('.dot:eq('+equalize+')').addClass('filled'); 
        bioInfo(equalize); 
       } 
      } 

      function mouseEx(){ 
       $(".TLBtn").mouseover(function(){ 
        if(!$(this).hasClass('clkd')){ 
         $(this).addClass("timeROver"); 
        } 
       }).mouseout(function(){ 
        if(!$(this).hasClass('clkd')){ 
         $(this).removeClass("timeROver");  
        } 
       }); 

       $(".TLBtn").click(function(){ 
        $(".TLBtn").removeClass('clkd timeROver'); 
        $(this).addClass('clkd timeROver'); 
       }) 
      } 

      function timeLineInfo(){ 

      } 

      function bioInfo(ix){ 
       $('.bioCon').fadeOut(100, function(){ 
        $('#bioImage > img').attr('src',bioContent[ix].image); 
        $('#bioName').html(allVars.bioContent[ix].name); 
        $('#bioTitle').html(allVars.bioContent[ix].title); 
        $('#bioDisc').html(allVars.bioContent[ix].details); 
        $('.bioCon').fadeIn(); 
       }); 
      } 
     } 
    //end bio page code. 


      //call content json. 
      function contentJson(){ 
       $.getJSON("content.json", function(json){ 
       allVars.allContent = json; 
       allVars.nums = 8000; 


       }); 
      } 
}); 

我錯在這裏做什麼,我???

+1

如果你用'alert'替換'console.log',輸出是否正確? – 2012-01-12 17:39:58

+0

適用於Chromium 18.0.997.0的我,可能是瀏覽器問題。 – JaredMcAteer 2012-01-12 17:40:31

+2

給出的代碼工作正常。 – Esailija 2012-01-12 17:45:02

回答

1

問題是這些函數正在異步運行,並且bioPageClassgetJSON完成之前被調用。將其更改爲bioPageClass作爲回調調用。

你可以這樣做,如果你想:

在頂部:

contentJson(bioPageClass); 

contentJson

function contentJson(callback){ 
    $.getJSON("content.json", function(json){ 
    allVars.allContent = json; 
    allVars.nums = 8000; 
    callback(); 
    }); 
} 

但它可能是更容易(和更好的做法)來傳遞allVars左右而不是全球化。將其定義在contentJson中,然後將其傳遞給bioPageClass。沒有發燒友的回調,你可以這樣做:

function contentJson(){ 
    var allVars = {}; 
    $.getJSON("content.json", function(json){ 
    allVars.allContent = json; 
    allVars.nums = 8000; 
    bioPageClass(allVars); 
    }); 
} 
+0

ahhhh 1000謝謝你是我的朋友,這是做的伎倆。 – zero 2012-01-12 18:21:42

+0

在幾乎所有情況下,ajax函數都將異步運行,因此它們在等待結果時不會阻塞接口。這是Javascript歷史上最偉大的功能之一。但是,這意味着你必須警惕像你這樣的問題。代碼中的順序位置並不總是意味着順序執行。每當你想確定在ajax調用後運行的東西,一定要把它放在回調函數中。 – glortho 2012-01-12 18:24:44

+0

啊gotcha。如果有一個函數(讓我們稱之爲initAll)持有所有主函數調用(例如biopageclass,homepageclass等等),然後讓initAll作爲回調函數(它會傳遞它的對象allvars,那麼它會通過) allvars到其他主要功能)? – zero 2012-01-12 18:37:39