丢失的变量在哪里?

时间:2009-09-28 19:16:24

标签: jquery

我有以下内容:

var element = $(this);
var divName = element.parents("div:eq(0)").attr("name");
$.each(boxInfo,function(i,n) {
    if( n.boxName == divName )
    {
        var newHeight = n.boxHeight;
    }
});

clicked.parents("div:eq(0)").animate({
    height: newHeight + 'px'
}, 1000);

问题是“newHeight undefined”。但如果我这样做:

var element = $(this);
var divName = element.parents("div:eq(0)").attr("name");
$.each(boxInfo,function(i,n) {
    if( n.boxName == divName )
    {
        alert(n.boxHeight);
        var newHeight = n.boxHeight;
    }
});

clicked.parents("div:eq(0)").animate({
    height: newHeight + 'px'
}, 1000);

它返回高度。如何确定变量的5行未定义?

2 个答案:

答案 0 :(得分:4)

名为newHeight的变量是在匿名函数(作为参数传递给$.each的函数)中声明的。这意味着它的值仅在该匿名函数中可用。这个概念叫做scope。它解释了为什么你的变量在匿名函数之外是未定义的。

如果您更改了代码以在更广泛的范围内声明变量,那么您的代码将按预期运行。观察:

var element = $(this);
var divName = element.parents("div:eq(0)").attr("name");
var newHeight;
$.each(boxInfo,function(i,n) {
    if( n.boxName == divName )
    {
        newHeight = n.boxHeight;
    }
});

clicked.parents("div:eq(0)").animate({
    height: newHeight + 'px'
}, 1000);

答案 1 :(得分:0)

newheight的范围仅限于您应用于每个boxinfo的匿名函数。你需要在newheight之前删除var以使其成为全局变量。

另外,您的代码效率不高,因为您似乎正在使用each()来执行jquery可以为您执行的操作,例如,$(boxInfo).find('[boxName=' + divName + ']')