JSLint的“窗口”作为全局变量的问题


75

因此,我正在使用JSLint尝试检测错误。我关闭了一些我不喜欢的选项,但是我看不到任何能够使用window全局变量的方法。嗯,有Yahoo Widget选项,但这太过分了。

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


您如何使用窗口?尽管下面的bjoernwibben解决方案似乎可以完成工作,但您可能可以删除对它的依赖。
格维兹ħ

好吧,我正在使用它作为window.setTimeout。我知道我不必这样做,也许应该这样做,但是在某些使用Firefox扩展程序中的多个窗口的地方,我需要访问它。谢谢!
比约恩

强制性JSHint评论。它解决了其中一些JSLint问题,并且是更漂亮的恕我直言。;)
DondeEstaMiCulo 2014年

Answers:


135
/*jslint browser: true*/

是对此的正确解决方案。从2017年7月7日起,您必须手动设置全局指令。从JSLint文档

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

因此,您将需要使用:

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

@bjoernwibeen在回答中说,到目前为止,这是正确的解决方案。请注意,我们两个答案都有两年的差异。
马特·克拉克森

1
支持此功能的官方文档可以在以下位置找到:jslint.com/lint.html#options Some 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.这也包括窗口。
Koen Zomers 2014年

将其标记为正确答案。应该添加关于这个问题的评论,这样我会收到警报,这三年来还没有解决。:P
Bjorn 2014年

1
@BjornTipling,对不起。我现在知道以后可以对这个问题进行评论!
Matt Clarkson 2014年

@ ryanpcmcquen,JSLint手册剧照说这是正确的方法。jslint.com网站目前甚至忽略了“浏览器”复选框。
马特·克拉克森

76

像这样在脚本中添加评论:

/*global window */

... your script goes here

该注释将告诉JSLint在window其他地方定义。

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

JSLint还可以识别/* global */注释,该注释可以指示JSLint该文件中使用的变量是在其他文件中定义的。注释可以包含逗号分隔的名称列表。每个名称都可以选择后面跟一个冒号,并且可以为true或false,如果为true,则表示该文件可以将变量分配给它;如果为false,则表示不允许该赋值,这是默认设置。

如果您希望窗口默认为全局窗口,而不必在脚本中应用注释,则可以在本地文件功能predef:["window"]内添加到对象常量参数。JSLINTjslint.js

顺便说一句,我也使用predef:["$","window"]jQuery全局。

更新:

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


5
即使这项工作不是正确的答案。browser: true是。
汤姆·罗杰罗

如上面的答案中所述,马特·克拉克森的答案现在是正确的答案。
superluminary 2014年

1
注意,/*和之间不应有空格global,否则JSLint显然会忽略该声明。
KajMagnus 2014年

这对我很有用,因为我正在构建具有其他一些全局变量的东西,所以谢谢。
史蒂夫2015年

现在,这将是答案,因为它/*jslint browser: true*/不再起作用。
ryanpcmcquen 2015年

4

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

/*global window*/

我曾经能够使用:

/*jslint browser: true */

但这似乎不再起作用。现在,根据JSHint关于该browser选项的帮助

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

我不确定何时进行更改,但这使我陷入了困境。


3

我不得不在代码上使用以上两个答案,以摆脱所有警告:

/*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网站时的解决方案:

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

1

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

"globals": {
    "window": true,
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.