Javascript 唯一变量per.click(函数(){..});
我希望每次单击都与表Javascript 唯一变量per.click(函数(){..});,javascript,jquery,Javascript,Jquery,我希望每次单击都与表框中的正确匹配项相关联 var J = jQuery.noConflict(); const bNumber = 2; var boxes = new Array(bNumber); boxes[0] = new Array("#cch", "#cc"); boxes[1] = new Array("#sinh", "#sin"); for(var k=0;k<bNumber;k++) { J( boxes[k][0] ).click( fu
框中的正确匹配项相关联
var J = jQuery.noConflict();
const bNumber = 2;
var boxes = new Array(bNumber);
boxes[0] = new Array("#cch", "#cc");
boxes[1] = new Array("#sinh", "#sin");
for(var k=0;k<bNumber;k++) {
J( boxes[k][0] ).click( function() {
//J( boxes[k][1] ).toggle();
});
}
var J=jQuery.noConflict();
常数bNumber=2;
变量框=新数组(b编号);
框[0]=新数组(“#cch”,“#cc”);
框[1]=新数组(“#sinh”,“#sin”);
对于(var k=0;kJavaScript没有块作用域,只有函数作用域。这就是为什么在循环中创建函数很棘手的原因。每个闭包都引用相同的变量(k
),在循环的最后一次迭代之后,k
的值为2
要捕获循环计数器的当前值,必须引入新的作用域,即调用函数。例如,使用立即数函数:
试试这个:
var J = jQuery.noConflict();
const bNumber = 2;
var boxes = new Array(bNumber);
boxes[0] = new Array("#cch", "#cc");
boxes[1] = new Array("#sinh", "#sin");
function toggleHandler(k) {
J( boxes[k][1] ).toggle();
}
for(var k=0;k<bNumber;k++) {
J( boxes[k][0] ).click( function() {
toggleHandler(k);
});
}
var J=jQuery.noConflict();
常数bNumber=2;
变量框=新数组(b编号);
框[0]=新数组(“#cch”,“#cc”);
框[1]=新数组(“#sinh”,“#sin”);
函数切换处理程序(k){
J(框[k][1]).toggle();
}
对于(var k=0;k对于可读和可理解的代码,将目标框作为“数据”存储在元素上
for(var k=0;k<bNumber;k++) {
J(boxes[k][0]).data("box") = $(boxes[k][1]);
J(boxes[k][0]).click( function() {
J(this).data("box").toggle();
});
}
用于(var k=0;kscope在本例中不是问题。请看,在函数上下文中无法访问k
,因此闭包和词法作用域在这里并不重要。@jAndy:是的。在您的小提琴中,您没有访问单击处理程序中的k
。但是OP有。请看@jAndy:那么,注释行//J(box[k][1]).toggle();
do?@jAndy:我想他是因为它不起作用才把它注释掉的……或者你的意思是什么?注意最后一句话:在这个解决方案中,每次单击都与box[2][1]相关联@菲利克斯:看起来是这样。我当时什么也没说。是的,我没有意识到被评论的那句话实际上是个问题,因为它被评论了。
var boxes = [["#cch", "#cc"], ["#sinh", "#sin"]];
var J = jQuery.noConflict();
const bNumber = 2;
var boxes = new Array(bNumber);
boxes[0] = new Array("#cch", "#cc");
boxes[1] = new Array("#sinh", "#sin");
function toggleHandler(k) {
J( boxes[k][1] ).toggle();
}
for(var k=0;k<bNumber;k++) {
J( boxes[k][0] ).click( function() {
toggleHandler(k);
});
}
for(var k=0;k<bNumber;k++) {
J(boxes[k][0]).data("box") = $(boxes[k][1]);
J(boxes[k][0]).click( function() {
J(this).data("box").toggle();
});
}