与JSHint相反,Backbone.js“使用new作副作用”吗?

时间:2014-01-16 19:23:55

标签: javascript backbone.js jslint

我有一个名为Backbone.View的自包含MainControllerView实现,可以自行处理(即没有理由对其进行外部引用。)。如果,在我的主要引导程序功能中,我会这样做:

$(function() {
  new MainControllerView();
});

JSLint / JSHint抱怨我使用“new for side effects”。阅读此警告表示上述内容被视为有臭味的代码。替代方法是不使用new,只是将构造函数作为函数调用,或者将其赋值给变量。但是,在不使用MainControllerView()的情况下直接将new作为函数调用会在主干代码中引发错误,因此这显然不是一个选项。对我来说似乎完全错误,以下是更好的代码:

$(function() {
  var instantGarbage = new MainControllerView();
}); 

实际上,这会引发一个不同的JSLint警告“instantGarbage已定义但从未使用过”。显然,如果我这样做,我就会感到危险,如果不这样做,我就会感到危险。那么,是否有一种不同的“正确”方式来处理这类事情?以某种方式创建即时垃圾变量是“更好的代码”替代方案吗? Backbone.js是否以非Crockford批准的方式利用“new”关键字?或者这只是“规则”的例外之一?

3 个答案:

答案 0 :(得分:10)

new无害。一遍又一遍地重复。

如果使用正确,new效果很好。就像Backbone一样。

JSLint是一个非常自以为是的短信;仅仅因为克罗克福德说某事不好或不应该使用,并不意味着这是一个普遍的事实。此外,他背后的推理更多的是它在一个更古典的外观背后隐藏了Javascript原型性质。

但是,如果您使用JSHint之类的工具,则可以配置这些警告。

我更喜欢你的两个声明中的后者

$(function() {
  var instantGarbage = new MainControllerView();
}); 

您可以使用JSHint的unused: false选项来禁止此操作。

或者您可以设置nonew: false

可以在.jshintrc甚至每个文件中设置这些注释:

/* jshint unused: false */

位于文件顶部。这将为文件关闭它。您甚至可以针对特定范围禁用它。

查看jshint documentation

答案 1 :(得分:1)

好的首先,克罗克福德是一个有意见的人;仅此而已。很多人不同意他的许多观点,这就是为什么JSHint库比JSLint更受欢迎,尽管JSLint具有先到先得的优势。

我强烈建议您切换到JSHint,这样您就可以不再担心Crockford关心的愚蠢事情,这实际上并没有使您的代码变得更糟。

答案 2 :(得分:1)

第一次阅读您的代码的其他人看一下。构造函数通常用于创建一个新对象,然后您可以对其进行操作。看看这个,看起来你只是制作了一个新视图,并立即扔掉它而不做任何事情。

所以是的,无论是否有JS [L / H] int,这都是“糟糕的代码味道”。看一下这篇文章 -

http://tmont.com/blargh/2014/4/constructors-should-not-have-side-effects