【问题标题】:javascript object property logs undefinedjavascript 对象属性日志未定义
【发布时间】:2012-01-12 17:38:23
【问题描述】:

好的,所以我在我的 js 文件的顶部声明了一个 js 对象,在底部我有一个函数,它正在创建一个属性并向它添加一个值,但是当我去控制台时,将新属性记录在不同的它返回未定义的函数,但如果我记录整个对象,它会显示该对象,其值如下的新属性是代码:

$(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;


                });
            }
});

我在这里做错了什么???

【问题讨论】:

  • 如果将console.log替换为alert,输出是否正确?
  • 在 Chromium 18.0.997.0 中为我工作,可能是浏览器问题。
  • 给定的代码工作正常。
  • 这就是代码吗?我在这里看不到 JS 文件的顶部/底部。我理解您的描述的方式是您尝试使用内联 JS 访问像上面那样创建的对象...除非在 .ready 命令触发后(在加载 DOM 后)调用它,否则它将不起作用
  • 好的,由于某种原因,这个例子现在可以工作了,但是当我将它扩展到更多的代码时它会失败:

标签: javascript object properties undefined logging


【解决方案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);
  });
}

【讨论】:

  • 在几乎所有情况下,ajax 函数都将异步运行,因此它们在等待结果时不会阻塞接口。这是 Javascript 历史上最伟大的特性之一。但是,这意味着您必须警惕像您这样的问题。代码中的顺序位置并不总是意味着顺序执行。每当您想确保在 ajax 调用之后运行某些东西时,请务必将其放入回调中。
  • 啊,明白了。拥有一个函数(让我们称之为initAll)保存所有主要函数调用(例如biopageclass,homepageclass等......)然后将initAll作为回调(它将传递对象allvars然后它会传递)是不好的做法allvars 到其他主要功能)?
  • 喜欢这个函数 initAll(allvars){biopageclass(allvars)//etc.. }
  • 我认为这是一个更好的方法。一个父函数,它涵盖所有内容并根据需要传递 var。即便如此,将 var 直接传递给需要它们的函数而不是依赖于闭包作用域可能会更有帮助/更安全,但任何一种方式都可以。
  • 但是这两种方式都意味着页面的 js 必须等待 json 完成被调用,这不会有效地取消它的异步能力吗?从本质上讲,这将使包含 json 的函数成为主要函数,因此如果 json 调用出现任何问题,则站点的其余 js 将不会加载?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多