【发布时间】: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