Javascript 关于jsLint错误的问题:“请参阅;Don';t在循环中生成函数“;

Javascript 关于jsLint错误的问题:“请参阅;Don';t在循环中生成函数“;,javascript,dom,Javascript,Dom,我正在阅读Jeremy Keith编写的DOM脚本,并用jsLint测试代码 在这里的代码示例中,我得到一个错误,上面写着“不要在循环中生成函数” 当我试图修复它时,我似乎正在失去这个的范围 我需要看一个如何修复此错误的示例 以下是JSFIDLE: 提前谢谢 sleeper您的代码似乎工作正常。事件处理程序函数中的this引用触发事件的DOM对象,它是元素。因此,您可以通过修改this的属性来更改样式。您也可以通过函数参数访问同一对象 current_row.onmouseover = func

我正在阅读Jeremy Keith编写的DOM脚本,并用jsLint测试代码

  • 在这里的代码示例中,我得到一个错误,上面写着“不要在循环中生成函数”
  • 当我试图修复它时,我似乎正在失去这个的范围
  • 我需要看一个如何修复此错误的示例
  • 以下是JSFIDLE:
  • 提前谢谢


    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不会抱怨循环中的函数,因为在这里的代码版本中,您没有函数。请参阅
    中如何使用
    循环word
    function
    从未出现?您已经重构了click handler函数定义,以在循环之前分离命名函数。如果您将它们指定为循环中定义的匿名函数,那么JSLint可能会对此发出警告,但您没有。这样做了。但我有几个问题:1.为什么要存储这些函数变量中的函数?2.这为什么会保持其作用域?thanx.我返回匿名函数的唯一原因是我可以通过call或Apply控制initMouseover的作用域您不需要为每个事件处理程序生成唯一的函数。从
    initMouseover
    中删除该嵌套函数,只需分配
    当前行onmouseover=initMouseover;
    这会很好用。这也很酷。它(对我来说)更容易遵循。但我也喜欢@Ivan的方法(使用变量)。这仅仅是因为味道还是性能问题。再次感谢。这可能主要是个人偏好,但我要说的是,为什么要执行一个函数以获得另一个函数?为什么不只是分配你想要的函数,因为它更简单而且可能更快。本地声明的命名函数非常有用。我一直在使用它们每当我想从多个地方调用同一个局部函数时。