如何解决 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 缩进警告?

jslint:如何抑制'预期的'Object.create(null)',而是看到'新对象'。警告?

在 Sublime Text 2 中隐藏不必要的 JSLint 警告

抑制 JSHint / JSLint 或替代服务中的“混合空格和制表符”警告?

带有闭包的 JavaScript For 循环导致 JSLint 警告

JSLint 错误:将所有“var”声明移动到函数顶部