jquery为什么我们得不到正确的价值观?

时间:2014-08-15 09:51:43

标签: jquery

$(function () {

    /*
    now we have next lines:
    <div id="cat">
        <a href="#" data-text="category1">category1</a>
        <a href="#" data-text="category2">category2</a>
        <a href="#" data-text="category3">category3</a>
        <a href="#" data-text="category4">category4</a>
    </div>
    */
    var category = $("body").find("#cat a");
    var OdjCategory = {};
    $(category).each(function(category_id,elem) {
        var num = category_id+1;
        $this_category = $(this);
        var timer1 = setTimeout(function(e) {
            $(this).trigger('click');
            var ArrOdjCategory = {
                "CategoryId" : num,
                "Name" : $this_category.attr('data-text')
            };
            OdjCategory[num] = ArrOdjCategory;
            console.log('main array = '+num);
            console.log(OdjCategory);
        }, 1000);
    });     
});

如果我们使用函数timeout()timer1,那么我们得到:

{
    1={Object { CategoryId=1, Name="category4"} }
    2={Object { CategoryId=2, Name="category4"} }
    3={Object { CategoryId=3, Name="category4"} }
    4={Object { CategoryId=4, Name="category4"} }
}

但它不对,应该是:

{
    1={Object { CategoryId=1, Name="category1"} }
    2={Object { CategoryId=2, Name="category2"} }
    3={Object { CategoryId=3, Name="category3"} }
    4={Object { CategoryId=4, Name="category4"} }
}

为什么我们得不到正确的价值观以及我们需要做些什么来获得正确的结果?

哪里有错误?

P.S。:如果我们不使用函数timeout()timer1,我们会得到很好的结果......但是我们需要这个函数来进行下一步操作。

1 个答案:

答案 0 :(得分:3)

$this_category = $(this);

您忘记了var关键字。

在您的代码中,$this_category被认为是一个全局变量,因此循环的最后一次迭代会覆盖以前的值,并且所有计时器函数都会访问相同的值。

Example