我可以使用JS Lint,JS Hint或其他工具阻止将错误数量的参数传递给方法吗?

时间:2015-07-02 22:58:32

标签: javascript jslint jshint

我是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都不认为这是一个错误。

是否还有其他工具可以帮助我?或者是否有一些理由说明为什么传递这样的参数不应该被错误检查?

3 个答案:

答案 0 :(得分:3)

使用静态分析工具通常无法做到这一点。这有几个原因:

  • 通常,JS函数可以接受任意数量的参数。
  • 大多数(全部?)linters一次只能处理一个文件。他们对其他文件中声明的函数一无所知
  • 无法保证作为函数调用的属性是您期望的函数。请考虑以下代码段:

    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 ...看看它是不是你要找的东西。