首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSLint不喜欢var

JSLint不喜欢var
EN

Stack Overflow用户
提问于 2015-01-19 13:41:29
回答 3查看 233关注 0票数 2

我在用JSLint检查我的代码中是否有错误,到目前为止,我设法修复了所有的bug,但当我的全局应用程序变量未定义时,问题除外。

在正确工作的JSlint之前,我使用了这段代码:

代码语言:javascript
复制
var APP = APP || (function {
    return {
        init: function () {

        }
    };
}(window.document));

然后我会打电话

代码语言:javascript
复制
APP.init();

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

代码语言:javascript
复制
(function (global){
    var APP = {
        init: function () {

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

这段代码通过JSLint测试没有问题,但是当我调用APP.init()时,它说APP是在定义之前使用的,这是正确的。如果我的代码通过了JSlint测试,您建议我不要使用全局变量,而是仍然创建我的应用程序对象。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-19 14:00:05

第一代码

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

代码语言:javascript
复制
 #1 'APP' used out of scope.
    var APP = APP || (function() { // Line 1, Pos 11

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

将代码更改为使用不同的变量名将解决此问题。

代码语言:javascript
复制
var app = APP || (function() {...}(..));

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

代码语言:javascript
复制
 #1 'APP' was used before it was defined.

第二代码

它不能工作,因为APP只在您创建的函数对象中可见。它在它之外的任何地方都看不见。由于您希望在全局范围中定义APP,所以只需将其附加到window对象,如下所示

代码语言:javascript
复制
(function(global) {
    global.APP = {
        init: function() {

        }
    };
}(window));

然后

代码语言:javascript
复制
APP.init()

会很好的。

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

代码语言:javascript
复制
window.APP = {
    init: function () {
        "use strict";
        ...
    }
};
票数 1
EN

Stack Overflow用户

发布于 2015-01-19 13:49:17

代码语言:javascript
复制
    (function (global){
    var APP = {
        init: function () {

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

上面的内容创建了一个作用域/闭包,这样只有您的匿名函数中的代码才能访问APP变量。JSHint有设置,因此您可以设置可接受的全局值(如jQuery等等),我将在其中添加APP,如果其他部分传递给您,您知道只有一个变量/模块是全局的。如果您正在使用任何第三方库,那么无论如何您可能已经有几个全局var了。

票数 1
EN

Stack Overflow用户

发布于 2015-01-19 14:28:35

在您使用give up on JSLint之前,要知道它根本不介意全局值;它只是希望您以一种特殊的格式声明它们,以便其他阅读您的代码的人能够确切地知道正在发生的事情。

这里唯一的“诀窍”是,如果您的全局APP还没有初始化,那么您确实需要检查它的“真实性”,就像使用APP = APP || (function...一样。然后,您确实需要使用window (或者不管您的全局对象是什么--例如,如果使用Node )前缀技巧就不同了。

下面是操作步骤:

代码语言:javascript
复制
/*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,但允许设置各种额外设置的灵活性也会削弱一致性,这在很大程度上是我发现代码链接的最大好处。给两个好的,坚实的运行,看看你最喜欢哪一个!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28025999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档