no-param-reassign
禁止重新分配函数参数
将值赋给声明为函数参数的变量可能会产生误导并导致行为混乱,因为当不在 strict 模式下时,修改函数参数也会改变 arguments 对象(见下文 何时不使用)。通常,赋值给函数参数是无意的,并且表明存在错误或程序员错误。
此规则也可以配置为在修改函数参数时失败。参数的副作用可能会导致违反直觉的执行流程,并使错误难以追踪。
规则详情
此规则旨在防止由于修改或重新分配函数参数而导致的意外行为。
此规则的 错误 代码示例
/*eslint no-param-reassign: "error"*/
var foo = function(bar) {
     = 13;
}
var foo = function(bar) {
    ++;
}
var foo = function(bar) {
    for ( in baz) {}
}
var foo = function(bar) {
    for ( of baz) {}
}
此规则的 正确 代码示例
/*eslint no-param-reassign: "error"*/
var foo = function(bar) {
    var baz = bar;
}
选项
此规则接受一个选项,一个对象,其中包含一个布尔属性 "props",以及数组 "ignorePropertyModificationsFor" 和 "ignorePropertyModificationsForRegex"。 "props" 默认为 false。 如果 "props" 设置为 true,则此规则会警告不要修改参数属性,除非它们包含在 "ignorePropertyModificationsFor" 或 "ignorePropertyModificationsForRegex" 中,后者默认为空数组。
props
默认 { "props": false } 选项的 正确 代码示例
/*eslint no-param-reassign: ["error", { "props": false }]*/
var foo = function(bar) {
    bar.prop = "value";
}
var foo = function(bar) {
    delete bar.aaa;
}
var foo = function(bar) {
    bar.aaa++;
}
var foo = function(bar) {
    for (bar.aaa in baz) {}
}
var foo = function(bar) {
    for (bar.aaa of baz) {}
}
{ "props": true } 选项的 错误 代码示例
/*eslint no-param-reassign: ["error", { "props": true }]*/
var foo = function(bar) {
    .prop = "value";
}
var foo = function(bar) {
    delete .aaa;
}
var foo = function(bar) {
    .aaa++;
}
var foo = function(bar) {
    for (.aaa in baz) {}
}
var foo = function(bar) {
    for (.aaa of baz) {}
}
设置了 "ignorePropertyModificationsFor" 的 { "props": true } 选项的 正确 代码示例
/*eslint no-param-reassign: ["error", { "props": true, "ignorePropertyModificationsFor": ["bar"] }]*/
var foo = function(bar) {
    bar.prop = "value";
}
var foo = function(bar) {
    delete bar.aaa;
}
var foo = function(bar) {
    bar.aaa++;
}
var foo = function(bar) {
    for (bar.aaa in baz) {}
}
var foo = function(bar) {
    for (bar.aaa of baz) {}
}
设置了 "ignorePropertyModificationsForRegex" 的 { "props": true } 选项的 正确 代码示例
/*eslint no-param-reassign: ["error", { "props": true, "ignorePropertyModificationsForRegex": ["^bar"] }]*/
var foo = function(barVar) {
    barVar.prop = "value";
}
var foo = function(barrito) {
    delete barrito.aaa;
}
var foo = function(bar_) {
    bar_.aaa++;
}
var foo = function(barBaz) {
    for (barBaz.aaa in baz) {}
}
var foo = function(barBaz) {
    for (barBaz.aaa of baz) {}
}
何时不使用
如果你想允许赋值给函数参数,那么你可以安全地禁用此规则。
strict 模式代码不会将 arguments 对象的索引与每个参数绑定同步。因此,此规则对于防止 ESM 模块或其他 strict 模式函数中的 arguments 对象突变不是必要的。
版本
此规则在 ESLint v0.18.0 中引入。