Javascript 关于jsLint错误的问题:“请参阅;Don';t在循环中生成函数“;
我正在阅读Jeremy Keith编写的DOM脚本,并用jsLint测试代码Javascript 关于jsLint错误的问题:“请参阅;Don';t在循环中生成函数“;,javascript,dom,Javascript,Dom,我正在阅读Jeremy Keith编写的DOM脚本,并用jsLint测试代码 在这里的代码示例中,我得到一个错误,上面写着“不要在循环中生成函数” 当我试图修复它时,我似乎正在失去这个的范围 我需要看一个如何修复此错误的示例 以下是JSFIDLE: 提前谢谢 sleeper您的代码似乎工作正常。事件处理程序函数中的this引用触发事件的DOM对象,它是元素。因此,您可以通过修改this的属性来更改样式。您也可以通过函数参数访问同一对象 current_row.onmouseover = func
sleeper您的代码似乎工作正常。事件处理程序函数中的
this
引用触发事件的DOM对象,它是
元素。因此,您可以通过修改this
的属性来更改样式。您也可以通过函数参数访问同一对象
current_row.onmouseover = function (event) {
console.log(this == event.currentTarget);
}
这将把true
记录到控制台,因为this
和事件.currentTarget
是同一个DOM元素对象
但是,是的,您是正确的,在
for
循环的范围内,this
(您不在该确切范围内使用)是顶级窗口
对象,但在事件处理程序函数中,this
是一个不同的对象。可能是这样的:
var initMouseover = function() {
return function () {
this.style.backgroundColor = "crimson";
this.style.color = "#ffffff";
};
};
然后在for循环中,您有:
current_row.onmouseover = initMouseover();
我在您发布的链接上测试了它,它似乎正常工作,也不再显示此错误。一种方法是在循环外定义本地函数:
(function highlightRows() {
"use strict";
if (!document.getElementById || !document.getElementsByTagName) { return false; }
function handleMouseOver () {
this.style.backgroundColor = "crimson";
this.style.color = "#ffffff";
}
function handleMouseOut() {
this.style.backgroundColor = "transparent";
this.style.color = "#000000";
}
var tbl = document.getElementById("tbl_example"), // get the table
rows = tbl.getElementsByTagName("tr"), // get all the table rows
i,
current_row;
// loop through rows adding style info to the mouseover/mouseout events
for (i = 0; i < rows.length; i++) {
current_row = rows[i];
// cancel highlight of th row
if (current_row.parentNode.tagName === "THEAD") {
continue;
}
current_row.onmouseover = handleMouseOver;
current_row.onmouseout = handleMouseOut;
}
}())
(函数highlightRows(){
“严格使用”;
如果(!document.getElementById | |!document.getElementsByTagName){return false;}
函数handleMouseOver(){
this.style.backgroundColor=“深红色”;
this.style.color=“#ffffff”;
}
函数handleMouseOut(){
this.style.backgroundColor=“透明”;
this.style.color=“#000000”;
}
var tbl=document.getElementById(“tbl_示例”),//获取表
rows=tbl.getElementsByTagName(“tr”),//获取表中的所有行
我
当前_行;
//循环通过行向mouseover/mouseout事件添加样式信息
对于(i=0;i
在JSFIDLE中工作:。好的,但是根据jsLint的说法,他们不喜欢循环中的函数。这就是为什么我需要看一个修改过的代码示例。请耐心听我说,我是一个傻瓜:)jsLint不会抱怨循环中的函数,因为在这里的代码版本中,您没有函数。请参阅中如何使用
循环wordfunction
从未出现?您已经重构了click handler函数定义,以在循环之前分离命名函数。如果您将它们指定为循环中定义的匿名函数,那么JSLint可能会对此发出警告,但您没有。这样做了。但我有几个问题:1.为什么要存储这些函数变量中的函数?2.这为什么会保持其作用域?thanx.我返回匿名函数的唯一原因是我可以通过call或Apply控制initMouseover的作用域您不需要为每个事件处理程序生成唯一的函数。从initMouseover
中删除该嵌套函数,只需分配当前行onmouseover=initMouseover;
这会很好用。这也很酷。它(对我来说)更容易遵循。但我也喜欢@Ivan的方法(使用变量)。这仅仅是因为味道还是性能问题。再次感谢。这可能主要是个人偏好,但我要说的是,为什么要执行一个函数以获得另一个函数?为什么不只是分配你想要的函数,因为它更简单而且可能更快。本地声明的命名函数非常有用。我一直在使用它们每当我想从多个地方调用同一个局部函数时。