我可以使用 JS Lint、JS Hint 或其他工具来防止将错误数量的参数传递给方法吗?
Can I prevent passing wrong number of parameters to methods with JS Lint, JS Hint, or some other tool?
我是 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 都不认为这是一个错误。
有没有其他工具可以帮我捕捉到这个?或者有什么理由不应该对这样传递的参数进行错误检查?
这通常是任何静态分析工具都做不到的。这有几个原因:
- 一般来说,JS函数可以接受任意数量的参数。
- 大多数(所有?)linter 一次只能处理一个文件。他们对其他文件中声明的函数一无所知
无法保证作为函数调用的 属性 就是您所期望的函数。考虑这个片段:
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
};
Paul Irish 不久前为此演示了一个 hack...在参数末尾传递 undefined
...
var testFunction = function (someMessage, undefined) {
alert("stuff is happening: " + someMessage);
};
testFunction("one", "two", "three");
他演示了它 here...看看它是否是您想要的。
我是 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 都不认为这是一个错误。
有没有其他工具可以帮我捕捉到这个?或者有什么理由不应该对这样传递的参数进行错误检查?
这通常是任何静态分析工具都做不到的。这有几个原因:
- 一般来说,JS函数可以接受任意数量的参数。
- 大多数(所有?)linter 一次只能处理一个文件。他们对其他文件中声明的函数一无所知
无法保证作为函数调用的 属性 就是您所期望的函数。考虑这个片段:
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
};
Paul Irish 不久前为此演示了一个 hack...在参数末尾传递 undefined
...
var testFunction = function (someMessage, undefined) {
alert("stuff is happening: " + someMessage);
};
testFunction("one", "two", "three");
他演示了它 here...看看它是否是您想要的。