【问题标题】:Scope question, var undefined in nested function范围问题,嵌套函数中未定义的变量
【发布时间】:2019-04-30 17:06:39
【问题描述】:

我使用这个 get 调用从一个 servlet 返回一个 json 映射。我创建了一个 var i = 0;统计数据中返回的用户数。我可以很容易地使用jsondata[i] 中的 i 来访问返回的用户。但是在下面我尝试在单击处理程序的嵌套函数中使用相同的 json 和 var 并且它给出了未定义的。我看了here,上面写着:

每个函数都有自己的作用域,在该函数中声明的任何变量只能从该函数和任何嵌套函数访问。因为 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");
            }); 

【问题讨论】:

  • 添加console.log(i),验证i的值。
  • @Code-Apprentice Aha i 在那里是 '2',而不是未定义。
  • 所以它只是在迭代完成后添加点击处理程序,这是有道理的,谢谢
  • 你修好了吗?你能显示完整的代码吗?也许你没有正确地遍历 jsondata
  • @Charis Theo 出于某种原因将点击处理程序设置在 .each() 之外使其工作

标签: javascript


【解决方案1】:

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

console.log(jsondata[i])

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

【讨论】:

    猜你喜欢
    • 2014-12-28
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    相关资源
    最近更新 更多