提问人:Dev 提问时间:7/19/2018 更新时间:7/19/2018 访问量:153
For 循环中的 jQuery 闭包 [duplicate]
jQuery Closure in For Loop [duplicate]
问:
我熟悉 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/
谢谢。
答:
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
括号不是使这个答案成为解决方案的原因;相反,它是将索引(作为参数)传递到父函数的作用域,使其可用于子函数的作用域。i
y
下一个:动态创建 Groovy 闭包
评论
i