JavaScript的奇怪行为

时间:2012-07-25 22:52:08

标签: javascript jquery

如果取消注释body.children().each(calc_deep(1));,我会在TypeError: Object [object Window] has no method 'attr'字符串上获得parseInt(deepest.attr('deep')),但如果没有取消注释,您可以在控制台中检查您是否可以调用deepest.attr('deep')。那是什么?

    var deepest;
    var calc_deep = function(i)
    {
        $(this).attr('deep',i);
        if(i>parseInt(deepest.attr('deep')))
            deepest=this;
        $(this).children().each(calc_deep(i+1));
    }
    var find_deepest = function()
    {
         body=$('body').children().eq(0);         
         body.attr('deep',0);
         deepest=body;
         //body.children().each(calc_deep(1));
    }
    find_deepest();

2 个答案:

答案 0 :(得分:4)

each接受一个参数的函数,你传递它undefined - 因为你先调用函数然后它的返回值是each()得到的。

改为使用function() {calc_deep(1);}

答案 1 :(得分:1)

第一个deepest是变量body,它是一个jQuery对象。稍后,当您将最深处分配给this时,它是一个常规DOM元素,它没有attr函数。

你有一个更大的问题 - this没有指出你认为它的元素。在没有函数参数的情况下调用$(this).children().each(calc_deep);。要获得深度,只需从父级获取。您正在调用函数calc_deep并将(不存在的)返回值传递给each。您希望将函数本身传递给每个函数。

var deepest, index;
var calc_deep = function() {
    var $this = $(this); //cache jQuery this
    var i = $this.parent().data("deep") + 1;
    $this.data('deep', i);
    if (i > index) {
        deepest = $this;
        index = i;
    }
    $this.children().each(calc_deep);
}
var find_deepest = function() {
    body = $('body').children().eq(0);
    body.data('deep', 0);
    index = 0;
    deepest = body;
    body.children().each(calc_deep);
}
find_deepest();

jsFiddle demo