当我点击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?
答案 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()