范围问题,嵌套函数中未定义的var

时间:2018-11-28 17:56:13

标签: javascript

我使用此get调用从servlet返回json映射。我创建一个var i = 0;计算返回数据的用户。我可以像在jsondata[i]中一样方便地使用i来访问返回的用户。但是下面我尝试在单击处理程序的嵌套函数中使用相同的json和var,它给出了未定义的信息。我看着C# using SendMessage, problem with WM_COPYDATA,它说:

  

每个函数都有自己的作用域,并且只能从该函数和任何嵌套函数访问该函数内声明的任何变量。由于JavaScript中的本地范围是由函数创建的,因此也称为函数范围。当我们将一个函数放到另一个函数中时,就会创建嵌套作用域。

那我为什么在点击处理程序中未定义?如果将console.log(jsondata[i]);更改为console.log(jsondata[0]);,则会看到正确的信息,而不是未定义的信息。

$.get("/lod1/Scuttlebutt",{name:"onload",data: -1},function(jsondata) {
    var numberofusers = jsondata.length;
    var i = 0;
    $(".mate").each(function(index) {
        //show
        $(this).css("display","block");
        //construct new id
        var mateid = 'mate'+jsondata[i][0].userid;
        //create ids for this mate
        $(this).attr('id',mateid+"MateContainer");
        $(this).find(".mateavatar").attr("id",mateid+"avatar");
        $(this).find("#matename").attr("id",mateid+"Name");
        $(this).find("#matepoints").attr("id",mateid+"Points");
        $(this).find("#matesensignia").attr("id",mateid+"Ensignia");
        $(this).find("#matebio").attr("id",mateid+"Bio");
        $(this).find("#matesets").attr("id",mateid+"Sets");
        $(this).find("#matebadges").attr("id",mateid+"Badges");
        //fill in correct info
        $(this).find("#"+mateid+"Name").text(jsondata[i][0].userName);
        $(this).find("#"+mateid+"Points").text(jsondata[i][0].points);
        $(this).find("#"+mateid+"Ensignia").attr('src',calculateEnsignia(jsondata[i][0].rank));

            //add onclick handler to username
            $(this).find("#"+mateid+"Name").on('click',function(){
                console.log(jsondata[i]);
                var num_tabs = $("div#tabmenu ul li").length + 1;

                $("div#tabmenu ul").append(
                    "<li><a href='#tab" + mateid + "'>" + jsondata[i][0].userName + "</a></li>"
                );
                $("div#tabmenu").append(
                    "<div id='tab" + mateid + "'> NEW TAB!</div>"
                );
                $("div#tabmenu").tabs("refresh");
            }); 

1 个答案:

答案 0 :(得分:0)

此代码仅在点击事件之后有效

  

console.log(jsondata [i])

您可以做什么,可以使用任何其他方式确定行的索引,然后可以使用它来获取数据