如何在由相互依赖的javascript文件组成的项目中有效地使用jshint?

时间:2015-01-23 10:38:22

标签: javascript jslint jshint

我是javascript的新手(来自C / C ++ / Java),所以请耐心等待。

在我看来,linting是一件好事。但是,我得到了很多"未定义的变量/参考"错误,我不知道如何以一种好的/有效的方式解决这个问题。

让我们说我有一个用Html / Javascript编写的更大的项目。所以我想将它分成彼此依赖的js模块,例如:

common_utils.js (depends on external lib d3.js)
app1.js (depends on common_utils.js)
app2.js (depends on common_utils.js as well)

首先,没有办法将commmon_utils.js包含/引用到app1.js中,对吧?我只能使用html文件中的动态加载,对吗?

(我的意思是,不是那种奇怪吗?似乎最常见的事情...... !!(再次:我来自C ++ / Java))

好的,公平的,所以jslint / hint无法确定只有在加载d3.js时才会使用common_utils.js。没问题,我添加

全球d3

到我的jshint配置,因为所有内容都在'命名空间'之下。不漂亮,但没关系。

但是我的common_utils.js怎么样? 我不想为该文件中的每个函数定义手动添加linter异常。

如何在javascript中组织和开发项目,我是否完全错了?

非常感谢你的时间!

1 个答案:

答案 0 :(得分:1)

  

关于如何在javascript中组织和开发项目,我是否完全错了?

不,你有钱。

听起来common_utils.js在你的掌控之中,对吗?也就是说,这是你的代码?我现在假设它是现在。

<小时/> 如果您发现要为每个功能添加例外,那么您不是 namespacing ,这将使linting lot 更容易。

请注意,这就是d3js正在做的,给予或接受的。以下是来自其网站的d3命名空间的d3用法示例:

  

D3采用声明式方法,在任意集合上运行   节点称为选择。例如,您可以重写上面的循环   为:

     

d3.selectAll("p").style("color", "white");

看到d3对象?你需要做同样的事情。

您应该在common_utils.js中声明一个“父”对象,并将每个函数附加到它。 然后,您只需要在JSL /提示设置中声明一个全局,以获取所有common_util.js函数。

以下是两个快速的非OO示例。第一个可能是最直接的。

  

请注意,您执行需要关键字及其第一个关注点之间的function(空格)。也就是说,var spam = function ()在JSLint中是正确的而var spam = function()不是。 JSLint认为第二个看起来像一个典型的命名函数,而不是赋值。很公平。

/*jslint browser: true, devel: true, sloppy: true, white: true */
var commonUtils = {};   // create the "parent" object.

// then add your functions to it, one by one.
commonUtils.test1 = function (myString) {
    if (console.log) { console.log("myString is: " + myString); }
};

commonUtils.test2 = function (myString) {
    window.alert("myString is: " + myString);
};

...或者 - 这是一个更常见的,我认为 - 你可以使用JSON表示法,一旦你得到上面的例子,这很容易理解:

/*jslint browser: true, devel: true, sloppy: true, white: true */
var commonUtils = {
    test1: function (myString)    {
        if (console.log) { console.log("myString is: " + myString); }
    },
    test2: function (myString)    {
        window.alert("myString is: " + myString);
    }
};

你也可以go full object oriented,如果这很重要,但现在听起来并不像你需要的那样。命名空间应该可以解决问题。

现在你可以用这样的代码调用......

/*jslint browser: true, devel: true, sloppy: true, white: true */
/*global commonUtils */

commonUtils.test1("console write");
commonUtils.test2("alert write");

您的全局列表中唯一的项目是commonUtils,无论您在其命名空间中有多少函数。瞧。