我有一个名为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”关键字?或者这只是“规则”的例外之一?
答案 0 :(得分:10)
new
无害。一遍又一遍地重复。
如果使用正确,new
效果很好。就像Backbone一样。
JSLint是一个非常自以为是的短信;仅仅因为克罗克福德说某事不好或不应该使用,并不意味着这是一个普遍的事实。此外,他背后的推理更多的是它在一个更古典的外观背后隐藏了Javascript原型性质。
但是,如果您使用JSHint之类的工具,则可以配置这些警告。
我更喜欢你的两个声明中的后者
$(function() {
var instantGarbage = new MainControllerView();
});
您可以使用JSHint的unused: false
选项来禁止此操作。
或者您可以设置nonew: false
。
可以在.jshintrc
甚至每个文件中设置这些注释:
/* jshint unused: false */
位于文件顶部。这将为文件关闭它。您甚至可以针对特定范围禁用它。
答案 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