no-param-reassign
禁止重新赋值函数参数
对声明为函数参数的变量进行赋值可能会产生误导并导致混乱的行为,因为修改函数参数在非严格模式下也会改变 `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) {}
}
何时不使用它
如果要允许对函数参数进行赋值,则可以安全地禁用此规则。
严格模式代码不同步 `arguments` 对象的索引与每个参数绑定。因此,此规则对于在 ESM 模块或其他严格模式函数中防止 `arguments` 对象突变不是必需的。
版本
此规则是在 ESLint v0.18.0 中引入的。