【问题标题】:Lost variable somewhere?在某处丢失变量?
【发布时间】:2009-09-28 19:16:24
【问题描述】:

我有以下几点:

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 行是如何未定义的?

【问题讨论】:

    标签: jquery


    【解决方案1】:

    您的名为 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);
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 你认为 jQuery 在幕后做了什么?至少使用.each,一旦找到它就可以将循环短路
      猜你喜欢
      • 2015-07-13
      • 1970-01-01
      • 2011-10-12
      • 2014-03-24
      • 2012-08-06
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多