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();
 });
}