无法访问关闭jQuery对象的方法

时间:2011-05-19 20:20:33

标签: javascript jquery closures

我有这样的功能:

var eatLunch = (function () {
    var sandwiches = [$("#sand1"), $("#sand2")];

    return function (eaten) {
        for (var i = 0, len = eaten.length; i < len; i++) {
            sandwiches[i].attr("class", "eaten-by " + eaten[i].by)
        }
    };
}());

eatLunch([
    {
        result: "good",
        by: "Adam"
    },
    {
        result: "meh",
        by: "Adam"
    }
]);

目的是将dom元素#sand1和#sand2缓存在一个闭包中,以减少此函数必须进行的dom触摸次数。如果没有闭包,每次调用函数时都必须将元素赋值给变量。

然而,attr方法似乎不起作用。在进一步检查时,定义了三明治[i],并且它具有attr方法。该函数不会抛出错误,它只是保持循环,但dom元素不会更新。

如果我将三明治放入本地范围,它可以很好地工作,但这样更贵。见下文:

var eatLunch = function (eaten) {
    var sandwiches = [$("sand1"), $("sand2")];

    for (var i = 0, len = eaten.length; i < len; i++) {
        sandwiches[i].attr("class", "eaten-by " + eaten[i].by)
    }
};

eatLunch([
    {
        result: "good",
        by: "Adam"
    },
    {
        result: "meh",
        by: "Adam"
    }
]);

这里发生了什么?

2 个答案:

答案 0 :(得分:1)

var i = 0, var len = eaten.length;

请勿在第二个中使用var。写:

var i = 0, len = eaten.length;

您还需要将eaten.by更改为eaten[i].by

轻微的错误很难找到。

Live Fixed Example

答案 1 :(得分:1)

您可能在加载DOM之前运行代码。

将其移至页面底部。