For 循环中的 jQuery 闭包 [duplicate]

jQuery Closure in For Loop [duplicate]

提问人:Dev 提问时间:7/19/2018 更新时间:7/19/2018 访问量:153

问:

我熟悉 JavaScript 闭包。几年前,我在做自己的项目时发现了关闭问题。在面试候选人时,我还加入了著名的 for-loop-button 问题。

现在,我被jQuery问到了这个问题。而且,在我的一生中,我无法解决问题。

$(document).ready( function() {
  var buttons = $('button');

  for( var i = 0; i < buttons.length; ++i ) {
    buttons.eq(i).click(
        // ONLY EDIT THE CODE BELOW THIS LINE
        function() {
            $('ul').append('<li>' + i + '</li>')
        }
        // ONLY EDIT THE CODE ABOVE THIS LINE
    );
  }
});

有谁知道如何在约束范围内在这里创建必要的闭包?

我尝试将匿名函数包装在括号中,返回内部函数等,但没有任何效果。

https://jsfiddle.net/hmw0gk4c/791/

谢谢。

JavaScript jQuery 闭包

评论

0赞 Greenstick 7/19/2018
不幸的是,问题已关闭,因此我无法发布答案。问题是您需要通过父函数的作用域将索引作为参数传递;子函数可以是匿名的。这里有一个有效的小提琴:jsfiddle.net/hmw0gk4c/867i
1赞 Dev 7/19/2018
我的“i”功能错误。
0赞 Dev 7/19/2018
我不同意这个问题在其他地方已经得到回答。如果我能找到答案,我就不会问了。这个特定问题要求在for循环中对解决方案进行编码。类似的问题提供了一个解决方案,该解决方案调用了 for 循环之外的函数。
0赞 Dev 7/19/2018
谢谢大家!
1赞 Dev 7/19/2018
此外,关于“已经回答”,顶部链接的问题是针对香草 JS 的。这个问题涉及jQuery,它需要稍微不同的语法。

答:

0赞 andriusain 7/19/2018 #1

这会是你所追求的吗?

$(document).ready( function() {
	var buttons = $('button');

	for( var i = 0; i < buttons.length; ++i ) {
		buttons.eq(i).click(
			// ONLY EDIT THE CODE BELOW THIS LINE
			return (function() {
				$('ul').append('<li>' + i + '</li>')
			})();
			// ONLY EDIT THE CODE ABOVE THIS LINE
		);
	}
});

评论

1赞 Dev 7/19/2018
这个答案适用于原版JS。但是您编写的代码位于“click”函数中。因此,答案需要是一个对象/函数,而不是一个语句。
0赞 AaronHolland 7/19/2018 #2

这样就可以了:

$(document).ready( function() {
  var buttons = $('button');

  for( var i = 0; i < buttons.length; ++i ) {
    buttons.eq(i).click(
        // ONLY EDIT THE CODE BELOW THIS LINE
        function() { 
                var i2 = i + 1; 
                return function() {
                    $('ul').append('<li>' + i2 + '</li>');
                }
            }()
        // ONLY EDIT THE CODE ABOVE THIS LINE
    );
  }
});

评论

0赞 Dev 7/19/2018
我发誓,我试过了。它现在可以工作了。但当时没有。
0赞 jkchu 7/19/2018 #3

这对我有用:

$(document).ready( function() {
  var buttons = $('button');
  for( var i = 0; i < buttons.length; ++i ) {
    buttons.eq(i).click(
      // ONLY EDIT THE CODE BELOW THIS LINE
      (function(y) {
        return (function() {
          $('ul').append('<li>' + y + '</li>')
        });
      })(i)
      // ONLY EDIT THE CODE ABOVE THIS LINE
    );
  }
});

评论

0赞 Dev 7/19/2018
双括号。没试过。它有效。谢谢。我给你检查(如果可以的话)没有创建一个新的var。
0赞 Greenstick 8/11/2018
括号不是使这个答案成为解决方案的原因;相反,它是将索引(作为参数)传递到父函数的作用域,使其可用于子函数的作用域。iy