【发布时间】:2019-02-05 22:10:51
【问题描述】:
在 ESLint 中,here 中记录的 no-param-reassign 规则禁止您分配函数参数的值。
这是为了避免修改函数的arguments 对象。
编码的正确方法是将参数重新分配给本地var 并返回var。这对于某些类型来说很好,但对于传递给函数的对象来说似乎毫无意义。
比如我们拿这个函数;
function foo(param) {
var copy = param; // This makes the linter happy
copy.bar = 2;
console.log('arg 0: ', arguments[0], 'param:', param, 'copy:', copy);
return copy; // A pointless return, the original object has been modified.
}
let test = { bar: 1 };
foo(test);
console.log(test); // Has been modified
test = foo(test); // a pointless reassignment, foo has already changed test.
console.log(test); // Same effect as previous function call.
公平地说,ESLint确实允许您使用 /*eslint no-param-reassign: ["error", { "props": false }]*/ 关闭此功能;但我不得不想为什么?
此规则的要点是摆脱可变性并保持arguments 对象的纯洁性,但对象的简单重新分配不会做到这一点。
真正做到这一点的唯一方法是深度克隆参数并将其分配给函数范围的变量。
我错过了什么吗?
【问题讨论】:
-
function(optionalArray,callback){if (typeof optionalArray === 'function') { callback = optionalArray; } doSomeAsyncStuff(); callback();}-- 我在野外看到的代码 -
可能没有足够的数据流分析来判断
copy在修改时是否仍然引用参数。 -
{ "props": false }是默认值。我不建议设置{ "props": true },因为它几乎无法捕获任何东西(如您所展示的),而且它捕获的东西是完全正常的事情。 -
@Barmar 我们正在使用 AirBnB linter 规则,他们已启用它。只是想知道启用它是否有一些合理的理由。我想也许我是对的,在修改对象属性时警告重新分配是没有意义的(除非目的是让人们克隆所有东西而不仅仅是重新分配)。
-
不开心。太愚蠢了,不能为此感到难过。
标签: javascript eslint