JSLint将'window'作为全局变量的问题

问题描述 投票:75回答:5

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

使用'window'有什么用处,为什么JSLint会说这会导致错误?

javascript jslint
5个回答
135
投票
/*jslint browser: true*/

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

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

所以你需要使用:

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

76
投票

只需在脚本中发表评论即可:

/*global window */

... your script goes here

此注释将告诉JSLint window是在其他地方定义的。

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

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

如果希望窗口默认为全局,而不必将注释应用于脚本,则可以将predef:["window"]添加到本地JSLINT文件的jslint.js函数内的object literal参数中。

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

更新:

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


4
投票

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

/*global window*/

我曾经能够使用:

/*jslint browser: true */

但这似乎不再奏效。现在,根据JSHint help关于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 website时的解决方案:

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

1
投票

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

"globals": {
    "window": true,
}
© www.soinside.com 2019 - 2024. All rights reserved.