当有许多外部定义的函数时,如何解决函数未定义的 JSHint 警告

How to address JSHint warnings that functions are not defined when there are many externally defined functions

这个常见问题的回答通常是声明每个 JavaScript 文件应该配置它在 JSHint 配置中使用的外部定义的全局变量。

就我而言,我有定义数百个函数的库文件。我还有许多其他文件调用这些库中的函数。

将每个库函数的名称复制并粘贴到 JSHint 配置中会很困难。

是否有更易于维护的方法来解决此警告?

  1. 是否有某种方法可以在对文件进行 linting 之前将文件与其库文件合并?
  2. 是否有解决此问题的替代工具?
  3. 是否有创建或使用 JavaScript 库的方法无需回答此问题?

理想情况下,此问题的任何答案都适用于 Eclipse 插件。

您应该检查 globals 选项。

在无法手动管理大量全局变量的情况下,最好的方法是为它们命名空间或自动编写 JSHint 配置。

命名空间

使用命名空间,类似于使用静态方法 类,您可以将相关的全局变量分组为单个对象的引用。我相信在现代编译器中,您应该期望在解析上述对象的关联引用时看到一些性能改进。

var gardening = (function () {
   var exports = {};
   exports.water = function () {};

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

   return exports;
})();

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

因此,与拥有几十个并肩的全局变量的 blob 不同,您可以提取一些对象来对引用进行分组。创建这样的层次结构支持大脑为与其目的相关的功能构建树状分辨率的能力。

动态编写 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 错误应该立即消失。