Javascript返回索引的负数

时间:2013-10-25 10:01:10

标签: javascript

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

1 个答案:

答案 0 :(得分:1)

虽然我不确定是什么导致了完全问题你注意到了,但是你在循环中使用闭包(匿名函数)遇到了一个非常常见的JavaScript陷阱。与许多其他支持函数式编程的语言一样,JavaScript具有方便的属性,函数可以在创建时围绕它们可见的任何变量“关闭范围”。所以,正如你在那里所做的那样,你可以在你的函数中使用d(或i)的值,只要它在声明函数时能够看到它们。

在循环中发生了一些有趣的事情:你在循环中创建的每个函数都共享相同的范围,这意味着它们共享{em>完全相同的副本d和{{1} }。因此,当您单击行的任何时,使用的id的值将是它们在循环结束时的值,而不是特定的迭代你的目标是什么。

这通常使用称为“生成器模式”的东西来修复,您可以在其中创建一个单独的函数,该函数返回在所需范围内关闭的新函数。例如,在您的代码中,您可能会执行类似

的操作
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} },而不是循环中使用的共享id值 - 当您调用i时,它们的值会被复制。这样,您的代码就不会受到奇怪的闭包效应。