【问题标题】:JSLint's issue with 'window' as a global variableJSLint 将“窗口”作为全局变量的问题
【发布时间】:2010-11-27 02:33:26
【问题描述】:

所以我使用JSLint 来尝试检测错误。我关闭了一些我不喜欢的选项,但我没有看到任何方法可以使用window 全局变量。嗯,有 Yahoo Widget 选项,但这有点过头了。

使用“窗口”有什么问题,为什么 JSLint 会说这会导致错误?

【问题讨论】:

  • 如何使用window?尽管下面的 bjoernwibben 解决方案似乎可以完成这项工作,但您可能可以删除对它的依赖。
  • 好吧,我将它用于 window.setTimeout。我知道我不必这样做,可能也不应该这样做,但是在某些地方,我在 Firefox 扩展程序中使用多个窗口时,我需要访问它。谢谢!
  • 必填JSHint 评论。它解决了其中一些 JSLint 问题,并且更漂亮的恕我直言。 ;)

标签: javascript jslint


【解决方案1】:
/*jslint browser: true*/

这是正确的解决方案。从 2017-07-07 开始,您必须手动设置全局指令。来自JSLint documentation

/*global*/ 指令用于指定该文件可用的一组全局变量(通常是函数和包含函数的对象)。在 ES6 模块出现之前,这通常在浏览器中用于将源文件链接在一起。强烈建议不要使用全局变量,但不幸的是 Web 浏览器需要使用它们。 /*global*/ 指令只能在选择 Assume a browser 选项时使用。

所以你需要使用:

/*jslint browser */
/*global window */

【讨论】:

  • @bjoernwibeen 在他的回答中说这是目前正确的解决方案。请注意,我们的两个答案都相差两年。
  • 支持这个的官方文档可以在:jslint.com/lint.html#optionsSome globals can be predefined for you. Select the Assume a browser (browser) option to predefine the standard global properties that are supplied by web browsers, such as document and addEventListener.这也包括window。
  • 将其标记为正确答案。应该添加对这个问题的评论,所以我会收到一个在这 3 年内没有修复的警报,为时已晚。 :P
  • @BjornTipling,对不起。我现在知道以后要对这个问题发表评论!
  • @ryanpcmcquen,JSLint manual 剧照说这是正确的做法。 jslint.com 网站目前甚至忽略了“浏览器”复选框。
【解决方案2】:

如果您不想在每个文件中指定它,您可以在 eslintrc 配置文件中全局设置它,如下所示:

"globals": {
    "window": true,
}

【讨论】:

    【解决方案3】:

    要让 JSLint 知道您将 window 识别为全局对象,请在文件顶部添加以下指令:

    /*global window*/
    

    我以前可以用:

    /*jslint browser: true */
    

    但这似乎不再有效。现在,根据JSHint help 关于browser 选项:

    它不提供selfwindow;您必须自己请求可怕的全局对象的这些别名。

    我不知道什么时候做出的改变,但它让我受阻了一段时间。

    【讨论】:

      【解决方案4】:

      我不得不在这段代码上使用上述两个答案来消除所有警告:

      /*jslint browser:true*/
      /*global window*/
      // eventBoiler v0.1.1 by @ryanpcmcquen
      // https://github.com/ryanpcmcquen/eventBoiler
      (function (win, doc) {
          'use strict';
          win.eventBoiler = function (selector, typeOfEvent, func) {
              doc.querySelector(selector).addEventListener(typeOfEvent, func);
          };
          win.eventBoiler.all = function (selectors, typeOfEvent, func) {
              Array.prototype.slice.call(doc.querySelectorAll(selectors)).map(function (i) {
                  i.addEventListener(typeOfEvent, func);
              });
          };
      }(window, document));
      

      所以对我来说,这是使用JSLint website时的解决方案:

      /*jslint browser:true*/
      /*global window*/
      

      【讨论】:

        【解决方案5】:

        只需在您的脚本中添加这样的注释:

        /*global window */
        
        ... your script goes here
        

        这条评论会告诉 JSLint window 是在其他地方定义的。

        见:http://www.JSLint.com/lint.html

        JSLint 还可以识别/* global */ 注释,该注释可以向 JSLint 表明此文件中使用的变量已在其他文件中定义。注释可以包含一个逗号分隔的名称列表。每个名称后面都可以选择跟一个冒号,true 或 false,true 表示该变量可以由该文件分配,false 表示不允许分配,这是默认设置。

        如果您希望窗口默认是全局的,而不必将注释应用到您的脚本,您可以将 predef:["window"] 添加到本地 jslint.js 文件的 JSLINT 函数内的对象字面量参数中。

        顺便说一句,我正在使用predef:["$","window"] 来拥有 jQuery 全局。

        更新:

        这个答案在 2009 年是正确的。到目前为止,您应该使用 解决方案 /*jslint browser: true*/ 由 Matt Clarkson 提供。

        【讨论】:

        • 即使这项工作也不是“正确”的答案。 browser: true 是。
        • 正如上面的答案中提到的,Matt Clarkson 的答案现在是正确的。
        • 注意/*global之间不能有空格,否则JSLint显然会忽略声明。
        • 这对我很有用,因为我正在构建具有一些其他全局变量的东西,非常感谢。
        • 这应该是现在的答案,因为/*jslint browser: true*/ 不再有效。
        猜你喜欢
        • 2022-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多