function highlightRows() {
if(!document.getElementsByTagName) return false;
var tables = document.getElementsByTagName("table");
for(var i=0;i

为什么注释的那两行不行,非要用this呢,这里this不是应该就是指代rows[j]么?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
变量作用域问题
假设
rows.length = 9
最后一次for执行完毕的时候
j = 9
所有的匿名函数里面 j = 9,
绑定事件的时候j还不是9,执行的时候j已经全部是都是9了
也就是你绑定的所有事件都只对最后一个生效。
解决方法是用闭包
因为
j不是你想象的j你的事件绑定的function,可以拿到rows[j],但是等到这个function执行的时候,for循环早结束了,你的j拿到的都是循环后的值。。。所以设置的都是最后一项吧
因为函数定义时所处的环境和函数运行时所处的环境(里面的东西),往往是不同的。
尤其是像题目中那样,存在异步的情况下。
简单地说,你那个回调函数被调用的时候,可能是1个小时以后了,那时候的
j早就与注册时的j不同了。代码
执行时,给当前循环内rows[j]也就是tr元素绑定事件,绑定后mouseover触发即会执行匿名函数。
假设你table有3行,当该段代码执行结束后,j已经变成3,此时不能够拿到正确的tr了呐。
这个rows[j]还真不是this呢。
for(var j =0;j<rows.length;j++){
骚年,你还没弄明白JavaScript函数的创建上下文和执行上下文的区别。
不需要看代码,你直接搜索一下两个概念就可以了,顺便你也就弄明白闭包、执行环境对象、作用域链的问题了。
我这个回答虽然简单,但我觉得切中要害。
翻译是我自己写的,我也在学这些内容,碰巧看到了就引用一下,恩,应该不会被打。
特别鸣谢:Special Thanks: Ben Alman