这是问题所在:我在Grunt中使用JSHint。我有几个JS文件,它们最终会合并成一个文件。但在合并之前,我想运行JSHint。但是,JSHint抱怨一些未定义的变量。下面是一个示例:1. JavaScript/file_one.js 定义了一个变量:var Foo = (function (){}());2. JavaScript/file_two.js 使用该模块。新福()。
jshint: {
files: ['Gruntfile.js',
'javascript/**/*.js',
],
options: {
// some options.
}
}
JSHint抱怨Foo没有在file_two.js中定义。
以下是我的目标(如果可能的话):1.我想在单独的文件中拥有代码。因此,某些变量可能在不同的文件中定义。2. 我想让JSHint检查源JS文件。我不想将所有JS文件合并为一个并让JSHint检查合并的文件。3. JSHint 可以检查 <%= jshint.files %> 中的所有文件(例如 javascript/**/*.js)并查找定义。
我知道有一个解决方法是将Foo作为选项中的全局变量,就像这篇文章中如何告诉JSLint/JSHint已经定义了哪些全局变量。但我不想把我定义的变量放在那里,因为每个这样的变量都在我的源文件中。
所以我的问题是是否有办法实现我的目标 3 告诉 JSHint 在其他文件中查找定义。
使用以下方法,其优点是根本不使用 JSHint 配置。
在第一个文件(为变量提供初始值的文件)中:
var username = "guest"; // it becomes: window.username
在另一个(第二个、第三个)文件中:
var username = window.username;
各种注意事项:
通过使用 var
声明,它成为窗口(全局)对象(window.username
)的属性。使用 var
,这样您就可以多次声明它(let
不能这样做)。
使用函数表达式(不是函数声明)的函数也可以这样做。
如果变量是对象(例如,函数)或不需要更改其值,则还可以在第二个文件中使用 let
。另一种选择是根本不在第二个文件中声明它。在这种情况下,每次使用时都使用 window
:
console.log(window.username);
使用这种技术,它还有一个额外的优势,即您可以将"超全局"变量(使用 var
声明并附加到全局对象 - 窗口的变量)与"仅全局"变量(使用 let
声明,您应该这样做,并附加到全局上下文而不是全局对象)。
你的目标无法实现。JSHint 将在您的 .jshintrc 或您的 Gruntfile 中查找配置。唯一可以进行的其他覆盖是在单个文件中本地进行。
如果您依赖于全局变量,则应禁用该设置,覆盖以在配置或每个文件中指定每个变量,或将它们全部放在命名空间中。
我强烈建议切换到模块模式,并禁止任何泄漏到全局范围内的内容
在file_two.js中告诉JSHint它使用的全局变量
/* global Foo, Bar */
对于file_one.js,您将收到一条消息,指出Foo已定义但未使用。所以你需要告诉JSHint其他文件会使用它
/* exported Foo */