在javascript中执行onclick功能时获取负值
function sun()
{
var d,i;
var t = document.getElementById("table");
var rows = t.getElementsByTagName("tr");
for (i = 0; i < rows.length; i++) {
console.log("inside............." + i);
rows[i].onclick = function() {
d = (this.rowIndex);
console.log(d);
};
}
}
答案 0 :(得分:1)
虽然我不确定是什么导致了完全问题你注意到了,但是你在循环中使用闭包(匿名函数)遇到了一个非常常见的JavaScript陷阱。与许多其他支持函数式编程的语言一样,JavaScript具有方便的属性,函数可以在创建时围绕它们可见的任何变量“关闭范围”。所以,正如你在那里所做的那样,你可以在你的函数中使用d
(或i
)的值,只要它在声明函数时能够看到它们。
在循环中发生了一些有趣的事情:你在循环中创建的每个函数都共享相同的范围,这意味着它们共享{em>完全相同的副本d
和{{1} }。因此,当您单击行的任何时,使用的i
和d
的值将是它们在循环结束时的值,而不是特定的迭代你的目标是什么。
这通常使用称为“生成器模式”的东西来修复,您可以在其中创建一个单独的函数,该函数返回在所需范围内关闭的新函数。例如,在您的代码中,您可能会执行类似
的操作i
新函数function generateClickHandler(i, d) {
return function() {
d = (this.rowIndex);
console.log(d);
};
}
function sun()
{
var d,i;
var t = document.getElementById("table");
var rows = t.getElementsByTagName("tr");
for (i = 0; i < rows.length; i++) {
console.log("inside............." + i);
rows[i].onclick = generateClickHandler(i, d);
}
}
返回一个函数本身,但重要的是要注意返回的函数关闭本地参数 generateClickHandler
和{{1} },而不是循环中使用的共享i
和d
值 - 当您调用i
时,它们的值会被复制。这样,您的代码就不会受到奇怪的闭包效应。