作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 ESLint 中,记录的无参数重新分配规则 here , 禁止您分配函数参数的值。
这是为了避免修改函数的 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 foo(param, flag) {
var copy = flag ? param : {...param};
copy.bar = 2;
console.log('arg 0: ', arguments[0], 'param:', param, 'copy:', copy);
return copy; // A pointless return, the original object has been modified.
}
现在它无法判断copy
是否包含与param
相同的对象或克隆,它取决于flag
的值。
或者像这样:
function foo(param) {
var copy = param;
var copy2 = copy;
var copy3 = copy2;
copy3.bar = 2;
console.log('arg 0: ', arguments[0], 'param:', param, 'copy:', copy3);
return copy3;
}
这需要跟踪整个引用链以确定 copy3
与 param
相同。
跟踪这一点并非不可能,优化编译器通常会这样做。但这对于 linter 来说可能有点矫枉过正。
关于javascript - 为什么只要重新分配对象,ESlint 就乐于让我修改对象属性?无参数重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52105930/
我是一名优秀的程序员,十分优秀!