我是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都不认为这是一个错误。
是否还有其他工具可以帮助我?或者是否有一些理由说明为什么传递这样的参数不应该被错误检查?
答案 0 :(得分:3)
使用静态分析工具通常无法做到这一点。这有几个原因:
无法保证作为函数调用的属性是您期望的函数。请考虑以下代码段:
var obj = { myFunc : function(a,b) { ... } };
var doSomething(x) { x.myFunc = function(a) { ... }; };
doSomething(obj);
obj.myFunc();
在调用myFunc
之后,无法知道doSomething
现在使用不同数量的args。
JavaScript是一种动态语言,您应该接受并接受它。
不是依靠linting来捕捉它不打算出现的问题,而是建议我为你的函数添加前提条件。
创建一个这样的辅助函数:
function checkThat(expression, message) {
if (!expression) {
throw new Error(message);
}
}
然后像这样使用它:
function myFunc(a, b) {
checkThat(arguments.length === 2, "Wrong number of arguments.");
通过适当的单元测试,您永远不会在生产中看到此错误消息。
答案 1 :(得分:1)
在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
};
答案 2 :(得分:0)
Paul Irish稍后演示了一次黑客攻击......在参数末尾传递undefined
...
var testFunction = function (someMessage, undefined) {
alert("stuff is happening: " + someMessage);
};
他演示here ...看看它是不是你要找的东西。