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

如何在由相互依赖的javascript文件组成的项目中有效地使用jshint?,javascript,jslint,jshint,Javascript,Jslint,Jshint,我是javascript新手(来自C/C++/Java),所以请耐心听我说 在我看来,脱毛是一件好事。然而,我得到了很多“未定义的变量/引用”错误,我不知道如何以“好的/有效的方式”解决这个问题 假设我有一个更大的项目是用Html/Javascript编写的。所以我想把它分成相互依赖的js模块,例如: common_utils.js (depends on external lib d3.js) app1.js (depends on common_utils.js) app2.js (depe

我是javascript新手(来自C/C++/Java),所以请耐心听我说

在我看来,脱毛是一件好事。然而,我得到了很多“未定义的变量/引用”错误,我不知道如何以“好的/有效的方式”解决这个问题

假设我有一个更大的项目是用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无法确定common_utils.js仅在加载d3.js时使用。没问题,我补充道

全球d3

对于我的jshint配置,因为所有内容都在该“名称空间”下。不漂亮,但还行

但是,我的公共_utils.js呢? 我不想为该文件中的每个函数定义手动添加linter异常

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

非常感谢您抽出时间

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

不,你有钱

听起来像是
common_utils.js
在你的控制之下,对吗?就是说,这是你的密码?我想现在是这样。
如果您发现您正在为每个函数添加异常,那么您就不是,这将使linting更加容易

请注意,这就是d3js正在做的事情。下面是一个d3在其网站上使用
d3
命名空间的示例:

D3采用声明式方法,对任意的数据集进行操作 节点称为选择。例如,您可以重写上面的循环 作为:

d3.选择全部(“p”).样式(“颜色”、“白色”)

看到那个
d3
对象了吗?你需要做同样的事情

您应该在
common_utils.js
中声明一个“父”对象,并将每个函数附加到该对象上那么您只需要在JSL/Hint设置中声明一个全局函数,就可以获得所有的
common_util.js
函数。

这里有两个快速的非OO示例。第一种可能是最直接的

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

。。。或者——我认为这更常见一点——您可以使用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);
    }
};
如果这很重要的话,你也可以,但听起来你现在不需要。名称空间应该可以做到这一点

现在您可以用这样的代码调用

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

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

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

非常感谢!这很有道理,解决了我的问题,并提供了一些有用的背景信息。然而,当函数调用被定义的变量/命名空间“隐藏”时,JSL/Hint似乎不再识别拼写错误的函数调用。例如,
d3.thereIsNoSuchFunction()
未报告为错误。真遗憾!啊,打得好。JSLLT是特定于文件的,并且可以考虑在LITER的范围之外检查函数名,尽管这很好。(KnockoutJS的作者)就JSHint的缺点提出了一个相关的观点:
“JavaScript是完全动态的,因此linter无法知道给定对象在运行时是否具有特定属性。”
这是公平的,不过,正如您所说,一个好的警告会很好。可能会尝试这样做;我想不起来了。WebStorm确实报告说这是一个“微弱的警告”-这是一些东西,我想这一切都是可能的,因为Steve Sanderson确实在那里提出了一个很好的观点。。。再次感谢。
/*jslint browser: true, devel: true, sloppy: true, white: true */
/*global commonUtils */

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