如何解决 JSLint 警告“不要使用 'new' 产生副作用”?
Posted
技术标签:
【中文标题】如何解决 JSLint 警告“不要使用 \'new\' 产生副作用”?【英文标题】:How do I address the JSLint warning "Do not use 'new' for side effects"?如何解决 JSLint 警告“不要使用 'new' 产生副作用”? 【发布时间】:2011-04-10 19:39:30 【问题描述】:为什么会出现这些错误?
第 329 行字符 60 处的问题:不要使用 'new' 作为副作用。
new widget.StyledDropdown(dojo.byId("sTitle"));
第 330 行字符 61 处的问题:不要使用 'new' 作为副作用。
new widget.StyledDropdown(dojo.byId("sSuffix"));
第 336 行字符 57 处的问题:不要使用 'new' 作为副作用。
true,shortenName : true,maxChars : 20);
第 338 行字符 129 处的问题:不要使用 'new' 作为副作用。
new widget.StyledDropdown(dojo.byId("sCountry"),USPS.Address.countrySw...
【问题讨论】:
您的其他八个问题都没有得到可接受的答案?没有? 我问错了问题。但我的问题已经解决了。 【参考方案1】:您没有存储对新创建对象的引用,这是代码异味。
JSLint 是在说“您正在创建一些对象但立即丢弃它们;您这样做的唯一可能原因是创建对象的行为有副作用,这很奇怪。”
您可以通过防止构造函数产生副作用(这意味着找到其他方法来做他们正在做的任何事情,例如通过将该代码移动到正常函数中)或存储对新创建的对象(即使在您丢弃的临时局部变量中)。
【讨论】:
如果你的意思是“代码味道”,那么我也是,但不幸的是它很贴切。 @Tim:是的,这就是我的意思。为什么我们不能只说“糟糕的做法”? 在实例化自身之后使用 new 将自身的实例向下传递到回调中,你会说什么? 解决方案的例子会很好。 我想知道这个...做new Notification(title: title, body: body)
是不好的做法,但做var unused; ... some code ... ; unused = new Notificaiton(title: title, body: body)
是好的做法吗?在我看来,将 ref 存储在 temp var 中也很糟糕且令人困惑。这也不会是另一个 jslint 错误(未使用的 var):function blah (args) var x = new Notification(args); /* more code */
?【参考方案2】:
重新考虑策略是最好的,但更多时候,在开发周期中处理技术债务并不是一种选择。
如果您使用 JSHint,您可以根据具体情况覆盖此选项。在有问题的代码范围内添加这个 jshint 注释。
/* jshint -W031 */
new widget.StyledDropdown(dojo.byId("sTitle"));
new widget.StyledDropdown(dojo.byId("sSuffix"));
...
内联配置是函数范围的。因此,仍然会检查评论范围之外的任何内容。
【讨论】:
【参考方案3】:我使用以下解决方案。它依赖于使用 new
关键字并覆盖 ESLint - 但该覆盖的范围仅限于包含该类的文件。
重要的是类是私有的,导出的是一个普通的函数。那么当你在代码中使用函数时,很明显它不是一个类——它只是一个普通函数。
这样你仍然可以使用类语法而不添加新的代码气味。
class SideEffects
constructor()
// ...
export function addSideEffects()
// eslint-disable-next-line no-new
new SideEffects();
【讨论】:
以上是关于如何解决 JSLint 警告“不要使用 'new' 产生副作用”?的主要内容,如果未能解决你的问题,请参考以下文章
jslint:如何抑制'预期的'Object.create(null)',而是看到'新对象'。警告?
在 Sublime Text 2 中隐藏不必要的 JSLint 警告
抑制 JSHint / JSLint 或替代服务中的“混合空格和制表符”警告?