我是 javascript 编程(以及一般脚本语言)的新手,但当我犯语法错误或意外声明全局变量时,我一直在使用 JS Lint 来帮助我。
但是,有一个场景 JS Lint 没有涵盖,我觉得这会非常方便。请参阅下面的代码:
(function () {
"use strict";
/*global alert */
var testFunction = function (someMessage) {
alert("stuff is happening: " + someMessage);
};
testFunction(1, 2);
testFunction();
}());
请注意,我向 testFunction 传递了错误数量的参数。我没有预见到自己会遇到这样的情况:我会故意省略一个参数或添加一个额外的参数。然而,JS Lint 和 JS Hint 都不认为这是一个错误。
还有其他工具可以帮我捕获这个问题吗?或者是否有某种原因为什么传递这样的参数不应该进行错误检查?
任何静态分析工具通常都无法实现这一点。造成这种情况的原因有几个:
无法保证作为函数调用的属性是您期望的函数。考虑这个片段:
var obj = { myFunc : function(a,b) { ... } };
var doSomething(x) { x.myFunc = function(a) { ... }; };
doSomething(obj);
obj.myFunc();
无法知道
myFunc
现在在调用 doSomething
之后采用不同数量的参数。
JavaScript 是一种动态语言,你应该接受并拥抱这一点。
我建议您向执行检查的函数添加先决条件,而不是依靠 linting 来捕获无意的问题。
创建一个像这样的辅助函数:
function checkThat(expression, message) {
if (!expression) {
throw new Error(message);
}
}
然后像这样使用它:
function myFunc(a, b) {
checkThat(arguments.length === 2, "Wrong number of arguments.");
通过正确的单元测试,您永远不会在生产中看到此错误消息。
这在 javascript 中是不可能的。你必须做这样的事情:
var testFunction = function (someMessage) {
var args = Array.prototype.slice.call(arguments);
if (args.length !== 1) throw new Error ("Wrong number of arguments");
if (typeof args[1] !== string) throw new Error ("Must pass a string");
// continue
};
您可以将 Visual Studio Code 与虚拟 JSDoc(如
/**@param _*/
)或自动生成的 JSDoc 一起使用,还可以将 "js/ts.implicitProjectConfig.checkJs": true
添加到您的设置中。
这样,您将强制 IDE 检查器将方法签名视为 TS 语言,并在错误数量的参数上放置波浪线(参数多于预期或参数少于预期)。可以选择使用
Error Lens
扩展使警报更加明显
Paul Irish 不久前演示了一个 hack...在参数末尾传递
undefined
...
var testFunction = function (someMessage, undefined) {
alert("stuff is happening: " + someMessage);
};
testFunction("one", "two", "three");
他在这里演示了它...看看这是否是您想要的。