【问题标题】:Why does JSLint say "anonymous function does not always return a value" for an event handler?为什么 JSLint 对事件处理程序说“匿名函数并不总是返回值”?
【发布时间】:2015-05-18 20:30:57
【问题描述】:

当我JSLint这个代码时:

$(document).keydown(function(e){ 
    if ($("#chaptersFunctionality").length !== 0) {
        if (e.keyCode == '13')
            return false;
        if ($("#kelvin").val() === "" && $("#caleb").attr("title") === "Show all steps") {
            switch(e.which){
            case 39:    if ((parseInt(currentAnchor)+1) < parseInt(maxi))
                expandMe(++currentAnchor);
                break;
            case 37:    if (currentAnchor > 0)
                expandMe(currentAnchor-1);
                break;
            }
        }
    }
});

...我收到了很多警告,其中大部分我都在摸索,但这个让我很难过: "匿名函数并不总是返回值"

为什么会这样说?事件处理程序不是匿名函数,是吗? 而且它无论如何都没有返回任何价值,是吗? 那么这意味着什么,以及什么会 [moll,pac] 安抚 linter?

【问题讨论】:

  • 事件处理程序是一个函数。该函数可以是匿名的(并且在您的代码示例中)。事件处理程序也可能返回一个值(在您的代码示例中这样做,请参阅return false 行)。但是,如果不采用第一个内部if 分支,则不会执行return 语句,并且您的处理程序将默认返回undefined。看起来 JSLint 不理解这一点。

标签: jquery anonymous-function jslint eventhandler


【解决方案1】:

只要函数的某些分支遇到return,而其他分支在没有遇到return 的情况下终止,JSLint 就会向您发出警告。 JSLint 认为函数应该总是显式返回值或从不显式返回值。 有时显式返回值的函数会为自己赢得警告。您的代码在一种情况下使用return false,否则从不使用return

如果你想安抚 JSLint,你可以在你的函数底部放置一个return undefined;,这样它总是显式地返回一些东西。

现在,我的意见是:

对于事件侦听器,仅有时返回值是 100% 可以接受的。使用您的事件侦听器 return 值的浏览器内部引擎已被编程为接受返回值或缺少返回值。

因为在事件监听器中不返回值的做法是完全正常的,这不会损害代码的可读性。我认为在这种情况下你可以放心地忽略 JSLint。

【讨论】:

  • 次要吹毛求疵:该函数“有时不返回值”,也不能“缺少返回值”。在这些情况下,无论您是否自己操作,函数 is 都会返回 undefined。我建议不要忽略错误并按照您最初建议的方式安抚 JSLint。正如Crockford says, JSLint will hurt your feelings,但这就是重点。如果您想要一致的代码,特别是在分布式组中工作时,linter 将免除感觉并将所有代码保持在 linter 的范围内。这就是他们的存在理由。 ;^)
  • @ruffin 在这些情况下,我已将“return”更改为“explicitly return”。我认为您的其余评论非常好;它帮助我更好地理解了 linter 的用途。
  • 很好——我认为这是次要的,但很重要,尤其是在 JSLinting 时。与 Crockford 关于正则表达式中“不安全 ^”的规则进行比较。他的偏见总是明确地控制和承担责任。所以在这里,如果你在 null 情况下显式返回 undefined,即使某些随机 JavaScript 引擎的默认 isn't 在函数不使用 return 时返回 undefined,你的函数将继续像以前一样运行。无论如何,酷,谢谢。很抱歉吹毛求疵。
猜你喜欢
  • 1970-01-01
  • 2010-11-26
  • 2020-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
相关资源
最近更新 更多