在Javascript中将参数作为内联函数中的值传递

时间:2012-08-03 17:02:39

标签: javascript jquery html

当我点击Javascript / jQuery中的链接时,我正试图让我的页面幻灯片滚动,但我无法弄清楚如何将我的for循环的当前增量值作为参数传递,在for中绑定我的链接上的点击事件。当我单击时,它调用我定义的函数,但是使用my i的当前值,而不是函数定义时的值...这是我的一些代码:

temp[0] = 0;
for(var i=1;i<8;i++)
{
    temp[i] = defaultPositions["slide"+i].top;
    console.log(defaultPositions["slide"+i].top);
    $('a.slide'+i).bind('click', function() {
    $('html, body').animate({scrollTop:(defaultPositions['slide'+i].top/slidesScrollSpeed)}, 1000, function() {
            parallaxScroll();
        });
        return false;
    });
}

你知道我如何传递i值,这样当我点击一个链接时,每个链接都具有良好的价值,而不是全部是slide8?

1 个答案:

答案 0 :(得分:4)

要点:

for (var i=1;i<8;++i){
  (function(i){
    // Your code using `i` in callbacks here
  })(i);
}

您的问题是,在所有闭包中共享一个变量i(为click处理程序创建的匿名函数,所有闭包都“关闭”{{1}的值在函数外部声明),所以当循环中该变量的值递增时,所有函数仍然引用相同的更新值。

通过将循环体包裹在一个以i值传递的函数中,每次迭代都会得到一个 new ,不同的变量i功能结束。为了更清楚地说明发生了什么,您可以将其写为:

i

或者,您可以为闭包创建一个自定义变量,如下所示:

for (var i=1;i<8;++i){
  (function(slideNum){
    // Your code using `slideNum` in callbacks here
  })(i);
}

另外,请注意 - 根据for (var i=1;i<8;i++){ var slideNum = 'slide'+i; // Create a new variable to use in the closure temp[i] = defaultPositions[slideNum].top; $('a.slide'+i).bind('click', function() { $('html, body').animate({ scrollTop:(defaultPositions[slideNum].top/slidesScrollSpeed) }, 1000, function() { parallaxScroll(); }); return false; }); } 的实施情况 - 您可以简化该行:

parallaxScroll()