JSLint 不喜欢 var

JSLint doesn't like var

我正在用 JSLint 探测我的代码是否有错误,到目前为止我设法修复了所有错误,除了我的全局应用程序变量未定义时的问题。

我在 JSlint 之前使用这段代码可以正常工作:

var APP = APP || (function {
    return {
        init: function () {

        }
    };
}(window.document));

那我就打电话给

APP.init();

进行初始化。但是 JSlint 不喜欢全局变量,所以我将代码更改为:

(function (global){
    var APP = {
        init: function () {

        }
    };
    return APP;
}(window.document));

此代码毫无问题地通过了 JSLint 测试,但是随后 当我打电话给 APP.init();它说APP在定义之前就被使用了,这是真的。 您会推荐什么,以便我不使用全局变量但仍然创建我的应用程序对象,同时我的代码通过 JSlint 测试?

    (function (global){
    var APP = {
        init: function () {

        }
    };
    return APP;
}(window.document));

上面创建了一个scope/closure,这样只有匿名函数中的代码才能访问APP 变量。 JSHint 有设置,所以你可以设置可接受的全局变量(比如 jquery 等),我会添加 APP 到它,如果其余的通过你知道你只有那个 variable/module 作为全局变量.如果您正在使用任何第 3 方库,那么您可能已经拥有多个全局变量

第一个密码

在您的原始代码中,您得到的实际错误是

 #1 'APP' used out of scope.
    var APP = APP || (function() { // Line 1, Pos 11

不是因为JSLint讨厌全局变量,而是因为它不喜欢分配给它的变量是在同一个var语句中定义的。

更改您的代码以使用不同的变量名可以解决此问题

var app = APP || (function() {...}(..));

但是,人们会期望 APP 已经在当前范围内定义。否则你会得到

 #1 'APP' was used before it was defined.

第二个密码

它不起作用,因为 APP 仅在您创建的函数对象中可见。在它外面的任何地方都看不到它。因为你想在全局范围内定义 APP,你只需要将它附加到 window 对象,就像这样

(function(global) {
    global.APP = {
        init: function() {

        }
    };
}(window));

然后

APP.init()

会很好用。

您可以像这样直接定义 APP 而不是经历所有这些

window.APP = {
    init: function () {
        "use strict";
        ...
    }
};

在你 之前,知道它根本不介意全局;它只是想让你用一种特殊的格式声明它们,以便其他阅读你的代码的人确切地知道发生了什么。

这里唯一的 "trick" 是如果您的全局 APP 有可能尚未初始化并且您真的需要检查它的 "truthiness",就像您对 APP = APP || (function...。然后你 do 需要使用 window(或者任何你的全局对象——例如,如果你使用 Node,它是不同的)前缀技巧。

方法如下:

/*jslint white:true, sloppy:true, browser:true */
/*global APP */

window.APP = window.APP || (function () {
    return {
        init: function () {
            window.alert('JSLint doesn\'t like empty blocks');
        }
    };
}(window.document));


APP.init();

JSLint 很高兴!

我在理论上并不反对 JSHint,但允许您设置各种额外设置的相同灵活性也会削弱一致性,这在很大程度上是我发现代码 linter 的最大好处。给两个都好看,扎实运行,看看你最喜欢哪个!