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

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

有没有其他工具可以帮我捕捉到这个?或者有什么理由不应该对这样传递的参数进行错误检查?

最佳答案

这通常是任何静态分析工具都做不到的。这有几个原因:

  • 一般来说,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 - 我可以使用 JS Lint、JS Hint 或其他工具来防止将错误数量的参数传递给方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31195952/

相关文章:

内联事件处理程序中未调用 JavaScript

javascript - 对对象(不是数组)使用 for 循环的替代方法是什么?为什么?

javascript - `new Object()` 和对象字面量表示法有什么区别?

javascript - 如何在 JavaScript 中将很长的正则表达式拆分为多行?

javascript - 当明确定义时,jshint 在 gulp 任务中抛出 TypeError

javascript - 将样式应用于 TypeScript 节点元素

javascript - 如何使用 Telegraf API 发送本地存储的照片?

javascript - 用函数包裹的 Angular 定义 Controller 是错误的吗?

javascript - 没有 JShint 警告的多行 JSON 字符串

javascript - Monaco 编辑器 - 与 JSHint 集成