如何处理JSHint警告,当有许多外部定义的函数时未定义函数?

3
这个经常被问到的问题通常是通过说明每个JavaScript文件应配置在JSHint配置中使用的外部定义全局变量来回答的。
在我的情况下,我有定义数百个函数的库文件。我有许多其他文件调用这些库中的函数。
将每个库函数的名称复制并粘贴到JSHint配置中将很难维护。
有没有更可维护的方法来解决这个警告呢?
1. 是否有一种在对文件进行linting之前将其与其库文件合并的方法? 2. 是否有另一种解决此问题的工具? 3. 是否有一种创建或使用JavaScript库的方法可以消除回答此问题的需要?
理想情况下,对这些问题的任何答案都将适用于Eclipse插件。

@gothy 我非常愿意这样做。我很好奇人们用什么方法来组织可重复使用的函数,而不是将它们放入单独的库文件中。 - John Cashew
@goty 谢谢。我的理解是Browserify是node.js的一个很好的解决方案,但我没有使用node.js。这些JavaScript文件仅在浏览器中使用。 - John Cashew
不,这是一种将前端代码结构化为CommonJS模块(类似于Node应用程序)的方法。您也可以尝试使用ES6模块,并使用代码转换器(如Babel http://babeljs.io/docs/learn-es6/#modules)。 - gothy
1
@JohnCashew 如果你提出一个问题并得到了答案,我强烈建议你在基于错误假设拒绝它之前实际检查一下。请回到 "browserify" 链接处仔细阅读。仅仅第一句话就足以质疑你的回复。 - Mörre
1
你的函数是否放在一个平坦的命名空间中?因为只有这样您才会遇到这个问题。外部文件中的函数应该在它们自己的命名空间中 - 然后您可以简单地为 jshint 添加一个或几个前缀到全局变量里。所以,在导入后你是使用 myFunction() 还是 MaNameSpace.myFunction()?你应该选择后者。 - Mörre
显示剩余4条评论
1个回答

2
你应该检查 globals 选项。
如果有大量无法手动管理的全局变量,最好的方法是将它们命名空间化或自动化JSHint配置的编写。
命名空间化类似于具有静态方法的类,您可以将相关全局变量作为单个对象上的引用进行分组。我认为,在现代编译器中,当解析所述对象上的关联引用时,您应该期望看到一些性能改进。
var gardening = (function () {
   var exports = {};
   exports.water = function () {};

   function till () {};
   exports.till = till;

   return exports;
})();

var debug = {
   prettyPrint: function (obj) {}
   inspect: function () {}
};

与其将数十个肩并肩的全局变量堆在一起,不如提取几个对象来分组引用。创建这样的层次结构支持大脑构建树状解决方案的能力,以解决相关的函数目的。

动态编写JSHint配置

如果您已经为项目实施了一些任务运行程序(您很可能已经这样做了),那么添加一些自定义任务以从源文件聚合全局变量时,当这些变量可以计算并且无法通过手动方法合理管理时,这不会有害。

#!/usr/bin/env node
// ./task.js
var fs = require('fs');

// Some pre-defined JSHint options
var jsHintOptions = {
   maxerr: 10,
   bitwise: true,
   globals: {
       foo: true,
       bar: false
   }
}

var cmd = process.argv[2];
if (cmd === 'author-jshintrc') authorJsHintRc();

// Hammer time!
function authorJsHintRc() {
    var globals = [];
    // Some fancy regular expression which can match
    // the globals from your sources
    var reMatchGlobal = /^\s+function\s([\w\d_]+)/gm;

    var extractGlobals = function (name) {
        var contents = fs.readFileSync(name).toString();
        var matches = contents.match(reMatchGlobal);
        globals.push.apply(globals, matches);
    }

    var registerGlobal = function (global) {
        jsHintOptions.globals[global] = false;
    }

    // These are our problematic source files which contain
    // too many globals to specify manually
    [
        'path/to/foo.js', 
        'path/to/bar.js'
    ].forEach(extractGlobals);

    // Extend the jsHintOptions with the dynamically resolved globals
    globals.forEach(registerGlobal);

    // Author the project's .jshintrc
    fs.writeFileSync('.jshintrc', JSON.stringify(jsHintOptions));
}

理想情况下,将 .jshintrc 文件放置或扩展到您的项目根目录中,应该意味着 Eclipse JSHint 插件会自动检查这些选项,从而使项目 JSHint 错误立即消失。

1
感谢您的周到回复。在我的问题中,我解释了使用您建议的方法的问题在于我需要将数百个函数名称复制并粘贴到此配置设置中。我正在寻找一种更易维护的解决方案。 - John Cashew
很抱歉疏忽了这么重要的细节,我会尝试编辑我的答案并提供一些可能的方法。 - Filip Dupanović

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接