【问题标题】:JSLint - Do not mutate parameter <x> when using 'arguments'?JSLint - 使用“参数”时不要改变参数 <x>?
【发布时间】:2012-02-21 10:00:50
【问题描述】:

全部,

我使用JSLint 来验证我的 JS 文件。在我最近的项目中,我使用以下格式为许多 JavaScript 函数设置默认值(更详细的here):

function(a, b, option) {
    option = arguments.length > 2 ? option : "some default value";
    // ...
}

然而,这会导致最新版本的 JSLint 产生以下错误:

"Do not mutate parameter 'option' when using 'arguments'."

我知道使用更常见的方法来分配默认值(即option = option || {};)会抑制错误;但是,如果我打算将 falsey 值传递给 option,这将产生不正确的行为。

这个问题的唯一解决方案是引入一个新变量吗?例如:

var option2 = arguments.length > 2 ? option : "some default value";

【问题讨论】:

  • 一个局部变量,也就是你的“引入第二个参数”是一个更好的解决方案。

标签: javascript parameters jslint


【解决方案1】:

我猜 JSLint 会警告您,因为您尝试使用带参数关键字的检查来修改其中一个输入参数。但是,JSHint 在尝试您的代码时确实会给我任何警告。

解决您的问题的方法是检查是否定义了option,这样您就可以通过发送虚假值来解决问题:

function(a, b, option) {
    if(typeof option === "undefined") {
        option = "some default value"; 
    }
    // ...
}

如果你觉得每次都写这个typeof检查比较麻烦,创建一个isDef函数:

function isDef(param) {
    return typeof param !== "undefined";
}
function(a, b, option) {
    option = isDef(option) ? option : "some default value"; 
    // ...
}

// 西蒙 A.

【讨论】:

  • 感谢您的建议 - 消除为 arguments.length 指定错误值的风险是一大优势。不幸的是,使用这种方法会导致 JSLint 产生同样的错误。
  • 你确定吗?当我运行上面的两个代码 sn-ps 时,JSLint 没有报错。
  • 事实证明我们都可能是对的,这取决于具体情况。在我的代码中,我有一个带有两个参数的函数,需要设置默认值。我只在第一个(出于测试目的)上使用了您的解决方案,而第二个仍然使用 arguments 变量。这导致 JSLint 针对 both 参数引发错误 - 非常奇怪!
【解决方案2】:

在大多数情况下,你最好还是这样做:

function(a, b, option) {
    option = option || "some default value";
    // ...
}

function(a, b, option) {
    if ( !option || typeof option !== 'string' ) { 
        option = "some default value";
    }
    // ...
}

【讨论】:

    猜你喜欢
    • 2014-05-09
    • 2014-03-09
    • 2017-05-22
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 2013-05-15
    • 2011-03-02
    • 1970-01-01
    相关资源
    最近更新 更多