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

时间:2015-04-12 19:33:01

标签: javascript jshint

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

在我的情况下,我有库文件,定义了几百个函数。我有许多其他文件来调用这些库中的函数。

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

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

  1. 是否有一些方法可以在将文件与其库文件组合之前将它们组合起来?
  2. 是否有可以解决此问题的替代工具?
  3. 是否有创建或使用JavaScript库的方法,无需回答此问题?
  4. 理想情况下,这个问题的任何答案都适用于Eclipse插件。

1 个答案:

答案 0 :(得分: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 () {}
};

因此,与具有数十个肩对肩全局变量的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错误应立即消失。