【问题标题】:Jquery assignment fails when inside a for loop在 for 循环内时,Jquery 分配失败
【发布时间】:2011-09-30 02:02:07
【问题描述】:

我有一个 jquery,当我这样做时可以正常工作:

var slide = [];
slide[1] = 
    {
        hide: function() {
            $("#slide-1").hide();
        },
        show: function() {
            $("#slide-1").show(2000);
        }
    };
slide[1].show(); <<< works fine

但如果我在循环中尝试失败:

for (var i=1; i <= totalSlides; i++) {
  slide[i] = 
    {
        hide: function() {
            $("#slide-" + i).hide();
        },
        show: function() {
            $("#slide-" + i).show(2000);
        }
    };
};
slide[1].show();  << unassigned

有什么想法吗?

【问题讨论】:

  • Ӫ_._Ӫ's answer at the bottom 我认为,但如果可以提供帮助,这里有一个或多或少相同的事情的活生生的例子。 jsfiddle.net/X4VQV
  • @richardneililagan:很好的例子来说明这个问题。
  • 有道理。因为我将“i”包装在闭包中,所以它被存储为指针而不是值。稍后调用 slide[1].show() 时,i 没有指向任何内容,并抛出错误“未定义”

标签: javascript jquery for-loop unassigned-variable


【解决方案1】:

嗯,你是说它是“未分配”,但我猜这个函数只是没有做你想做的事。

这是一个常见问题。您在循环中创建的所有函数都引用了相同的 i 变量。这意味着当函数运行时,它会在 循环结束后获得i 的值。

您需要在新的变量环境中限定函数引用的变量的范围,以保留循环中的值。为此,您需要调用一个函数,并让该函数引用当前的 i 值。

像这样:

function generate_functions( j ) {
     //    v----- DO NOT place the opening brace on the next line, after the
    return {              // return statement, or your code will break!!!
        hide: function() {
            $("#slide-" + j).hide();
        },
        show: function() {
            $("#slide-" + j).show(2000);
        }
    };
}

var slide = [];

for (var i=1; i <= totalSlides; i++) {

    slide[i] = generate_functions( i );

};

slide[1].show(); // should work

我创建了一个名为 generate_functions() 的函数,并在每次迭代中调用它,将 i 作为参数传递。

您会注意到generate_functions() 收到的值是j 参数。您也可以将其称为 i,但更改名称会使 IMO 更清晰一些。

所以现在你的函数引用了本地的j。因为每次调用generate_functions() 都会创建一个新的变量环境,所以您在其中创建的函数将引用该特定变量环境的j

所以generate_functions()返回包含在每个新变量环境中创建的函数的对象,并将该对象分配给slide[i]

【讨论】:

  • 稍微扩展一下,您要创建的是一个 Javascript 闭包。它可能是一种强大的语言 [功能],但如果您不熟悉它(因此,就像在您的问题中一样,意外地创建它),它可能会给您带来很大的痛苦。
【解决方案2】:

$("slide-1" + i).show(2000) 是错字还是错误?

【讨论】:

    【解决方案3】:

    for 循环上方添加var slide = [];

    【讨论】:

      猜你喜欢
      • 2020-07-30
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-05
      • 2019-03-31
      • 2016-02-29
      相关资源
      最近更新 更多