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

Javascript 无法访问关闭的jQuery对象的方法,javascript,jquery,closures,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)

我有这样一个函数:

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"
    }
]);
var=(函数(){
var三明治=[$(“#三明治1”),$(“#三明治2”);
返回函数(EAT){
for(变量i=0,len=0.length;i
其目的是在闭包中缓存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"
    }
]);
var eatLunch=函数(eat){
var sandwiches=[$(“三明治1”),$(“三明治2”);
for(变量i=0,len=0.length;i

这是怎么回事?

var i=0,var len=eat.length

不要在第二个选项中使用
var
。写:

var i=0,len=0.length

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

小错误很难发现


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


将其移到页面底部。

这并不能解释为什么他的第二个示例有效。我不知道这是否是他的真实代码。@Slaks,它被破坏了:\n这只是一个说明性的例子。这是一个简化版本。您提到的错误是示例中的打字错误。我已经更新了它们。抱歉搞混了。@Adam那么我们需要实际的代码。正如你所看到的,你的例子在我的小提琴中起作用。您的bug比您提供给我们的更复杂。我想就是这个。该函数是在这些元素出现之前定义的,因为页面内容是通过ajax加载的。我重构了代码以定义闭包中的变量,但没有分配它们。然后每次叫EatLinch时,我都会检查sandwiches.length是否为0。如果是这样,我将dom元素指定给三明治。这样,我只在第一次调用函数时支付dom的费用。