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

Passing a parameter as a value in an inline function in Javascript

本文关键字:参数 值传 函数 Javascript      更新时间:2023-09-26

当我在Javascript/jQuery中点击链接时,我试图让页面幻灯片滚动,但我不知道如何在绑定链接上点击事件的for中传递for循环的当前增量值作为参数。当我点击时,它会调用我定义的函数,但使用我的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

摘要:

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

您的问题是,在所有闭包(为click处理程序创建的匿名函数,即所有"关闭"函数外声明的i的值)之间共享一个变量i,因此,当该变量的值在循环中递增时,所有函数仍在引用相同的更新值。

通过将循环的主体包装在一个传递值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;
  });
}

此外,请注意:;取决于CCD_ 11—你可能会将这条线简化为:

$('html, body').animate({
  scrollTop:(defaultPositions[slideNum].top/slidesScrollSpeed)
}, 1000, parallaxScroll );