【问题标题】:What good is JSLint if jQuery fails the validation [closed]如果 jQuery 验证失败,JSLint 有什么好处[关闭]
【发布时间】:2010-10-05 01:13:08
【问题描述】:

所以我一直在探索不同的方法来清理和测试我的 JavaScript。我认为就像任何其他语言一样,要变得更好的一种方法是阅读好的代码。 jQuery 非常流行,因此它必须具有一定程度的良好编码。

那么为什么当我通过 JSLint 的验证运行 jQuery 时,它会给我这样的信息:

错误:

第 18 行字符 5 处的问题: 需要一个标识符,而是看到 'undefined'(保留字)。

未定义,

第 24 行字符 27 处的问题: 缺少分号。

jQuery = 窗口.jQuery = 窗口.$ = 函数(选择器,上下文){

第 24 行字符 28 处的问题: 需要一个标识符,而是看到 '='。

jQuery = 窗口.jQuery = 窗口.$ = 函数(选择器,上下文){

第 24 行字符 28 处的问题: 正在停止,无法继续。 (0% 扫描)

这是使用 JSLintjquery-1.3.1.js 完成的

【问题讨论】:

标签: javascript jquery


【解决方案1】:

JSLint 测试一个特定的人(Douglas Crockford)关于什么是好的 JavaScript 代码的意见。 Crockford 非常好,但他的一些意见充其量只是保留性,比如下划线规则,或者使用递增/递减运算符。

在上面的输出中 JSLint 标记的许多问题是 Crockford 认为导致难以维护代码的问题,或者是他认为过去导致他做“聪明”的事情可能很难的事情维护。

Crockford 认为有些事情是我同意的错误,比如缺少分号的事情。删除分号会迫使浏览器猜测在哪里插入语句结束标记,这有时会很危险(它总是很慢)。其中一些错误与 JSLint 不期望或不支持多个赋值有关,如 jQuery 在第 24 行所做的那样。

如果您有关于 JSLint 错误的问题,请发送电子邮件至 Crockford,他非常擅长回复,通过他的回复,您至少会知道为什么 JSLint 会以这种方式实现。

哦,仅仅因为一个库很受欢迎并不意味着它的代码有任何好处。 JQuery 很受欢迎,因为它是一个相对快速、易于使用的库。它的良好实施与它在许多人中的受欢迎程度无关紧要。但是,您当然应该阅读更多代码,我们都应该。

JSLint 在识别代码问题方面非常有帮助,即使 JQuery 没有通过它想要的标准。

【讨论】:

  • 所有观点都很好,很高兴指出流行不等于好
  • JQery 现在实际上尝试与 jslint 兼容!看这里->forum.jquery.com/topic/jquery-1-4-2-jslint-report
  • Crockford 不喜欢将 if / for / while 等语句放在一行中。他总是希望看到 {} 大括号。谁能澄清为什么这很重要? (可读性不是一个可接受的答案)。
  • 始终使用 {} 是为了防止您以后需要向条件/循环块添加更多语句,而忽略实际将代码放入块中,从而导致意外行为。我不知道有任何种代码风格的工具不会拒绝省略 {}。至于不在单行上,这是每个强制执行此操作的工具中的可读性问题(Microsoft 的 StyleCop 默认为 C# 强制执行此操作)。此外,正如 Crockford 在他的几次演讲中所说,他为自己设计了 JSLint 的规则,您可以禁用那些您不同意的规则。
  • jQuery 现在通过 lint 有一些他们在这里解释的例外情况:docs.jquery.com/JQuery_Core_Style_Guidelines#JSLint
【解决方案2】:

JQuery 当然不是世界上最好的东西。当您查看符号时,这已经很清楚了。美元括号组合对您的眼睛非常不利。编程应该清晰简单。 JQuery 远非如此。这个理由足以让我不使用它。它没有正确编写并不让我感到惊讶,只是强调了我对这个 JavaScript 库的看法。

【讨论】:

  • -1 因为我不同意这篇文章的几乎所有内容
【解决方案3】:

如果你喜欢像 jQuery 这样的菊花链方法,你可能会喜欢 YUI3。

【讨论】:

    【解决方案4】:

    我发现 JSLint 非常非常有用的一种情况:当你抓住一个漂浮在网络上的大型库时,然后是另一个,然后又是另一个,你很快就会发现自己加载了 50k 的 Javascript在每次新页面加载时(缓存可能会有所帮助,但它不是万能的解决方案)。

    那你会怎么做?压缩这些库。但是您的主机不会对非 html 文件进行压缩!所以呢?您使用 Javascript 压缩器。

    我找到的最好的是 Dean Edward 的;我用它来压缩 John Fraser 的 Showdown(JavaScript 库的 Markdown),但不幸的是,压缩破坏了代码。由于不再支持 Showdown,我不得不自己更正它 - JSlint 对此非常宝贵。

    简而言之,JSlint 有助于准备 JS 代码以进行重型压缩。

    【讨论】:

    • 现在任何值得一提的 JS 压缩器都会构建一个抽象符号树,因此可以进行必要的代码更改以正确压缩代码,前提是您实际上没有损坏的代码。
    【解决方案5】:

    “jQuery非常流行,所以它必须有一定程度的良好编码。”

    人们希望 jQuery 也是如此,但不幸的是,事实并非如此。 jQuery 有用且流行,但它不是一个编写良好的 JavaScript 库。 David Mark 最近在 comp.lang.javascript 中发布了对 jQuery 的严厉批评,其中检查了 jQuery 中发现的大量不良代码示例:

    http://groups.google.com/group/comp.lang.javascript/msg/37cb11852d7ca75c?hl=en&

    【讨论】:

    • 我刚刚阅读了整个帖子,并了解到 David Mark 是个混蛋,jQuery 很烂,所有 JS 库都很烂,任何你不自己写的东西都很烂,即使你写了它,它还是很烂。我没有找到 jQuery 的任何替代品,或者根本没有任何有用的建议。 jQuery它是
    • “jQuery 的替代品”?取决于你想使用什么。 jQuery 有这么多的特性,没有什么好东西会一应俱全。小型库具有小型功能集,因此您可以使用您需要的那些。
    • 显然应该是forkjavascript.org我下一个项目应该尝试它。
    【解决方案6】:

    FAQ [1] 中明确说明了 JsLint 的用途:

    “JSLint 定义了 JavaScript 的专业子集,这是一种比 ECMAScript 语言规范第 3 版定义的语言更严格的语言。该子集与 JavaScript 编程语言的代码约定中的建议有关。”

    现在,如果您感到困惑:ECMA3 已经是当今任何 JS 解释器提供的 JS 功能的一个子集(有关 JavasScript 和 ECMAScript 版本之间关系的概述,请参阅 [2])

    回答“JSlint 有什么好处”的问题: * 使用 JsLint 来验证您正在使用 Javascript 的“安全”子集,该子集不太可能破坏 JS 实现。 * 使用 Jslint 验证您是否遵循了 crockford 代码约定 [4]

    【讨论】:

      【解决方案7】:

      jQuery 开发人员的目标与您的目标不同。 jQuery 是为速度和紧凑性而构建的,实现这些目标胜过可读性和可维护性。

      Crockford 在 JSLint 中的测试更多地是为了实现一些让他感到很舒服的事情,让他可以放心地带回家见他的母亲,如果您将与您的代码结婚一段时间,这是一个有效的担忧。

      【讨论】:

        【解决方案8】:

        如果您不积极开发 jQuery 本身,为什么还要在其上运行 JSLint?如果它有效,它就有效,您不必担心。

        【讨论】:

        • 我明白你在说什么,但这样的解释对我们的程序员同事有何帮助?
        • 希望能让人们思考什么是相关的,什么是不值得花时间担心的?
        • 需要将 jQuery 传递给 JSLint 以避免您自己的代码出现“未定义”错误。
        • @HRJ 如果你说的是它引入的全局,那不是真的。只需在文件顶部或 JSLint 选项中包含 /*globals $, jQuery */
        【解决方案9】:

        JSLint 可以帮助您发现问题,它不是有效性测试或思维的替代品。随着 js 的发展,jQuery 相当先进,这使得这样的结果可以理解。我的意思是前几行是速度技巧,难怪最严格的 js 解析器会出现几个错误。

        无论如何,流行的代码是完全正确的代码甚至是“好”的假设是有缺陷的。 jQuery 代码很好,你可以从阅读中学到很多东西。你仍然应该通过 JSLint 运行你的东西,如果只是因为很高兴听到对你所写内容的另一个意见。

        来自 JSLint 的描述:

        JSLint 获取一个 JavaScript 源并对其进行扫描。如果它发现问题,它会返回一条描述问题的消息以及源中的大致位置。问题不一定是语法错误,尽管它经常是。 JSLint 着眼于一些样式约定以及结构问题。它并不能证明你的程序是正确的。它只是提供了另一双眼睛来帮助发现问题。

        JSLint 定义了 JavaScript 的专业子集,这是一种比 ECMAScript 语言规范第 3 版定义的语言更严格的语言。该子集与 JavaScript 编程语言的代码约定中的建议相关。

        【讨论】:

        • 很好的解释 - 很好地添加了 JSLint 站点的链接
        猜你喜欢
        • 1970-01-01
        • 2014-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-27
        • 1970-01-01
        • 2010-11-01
        • 2010-10-10
        相关资源
        最近更新 更多