JSLint不喜欢var

时间:2015-01-19 13:41:30

标签: javascript jslint

我正在使用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测试?

3 个答案:

答案 0 :(得分:1)

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

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

上面创建了一个范围/闭包,这样只有匿名函数中的代码才能访问APP变量。 JSHint有设置,所以你可以设置可接受的全局变量(比如jquery等),我会添加APP,如果其余的传递,你知道你只有一个变量/模块是全局的。如果您正在使用任何第三方库,则无论如何您已经拥有多个全局变量

答案 1 :(得分:1)

第一个代码

在您的原始代码中,您可能遇到的实际错误是

 #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";
        ...
    }
};

答案 2 :(得分:1)

在你give up on JSLint之前,要知道它根本不介意全局化;它只是希望您使用特殊格式声明它们,以便其他人阅读您的代码时确切知道发生了什么。

唯一的"技巧"在这里,如果您的全球APP尚未初始化,您确实需要检查其真实性",就像使用APP = APP || (function...一样。然后你需要使用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的最佳好处。给你一个好的,稳定的运行,看看你最喜欢哪个!