与 JSHint 相反,Backbone.js 是不是“使用 new 来产生副作用”?

Posted

技术标签:

【中文标题】与 JSHint 相反,Backbone.js 是不是“使用 new 来产生副作用”?【英文标题】:Does Backbone.js "use new for side effects" contrary to JSHint?与 JSHint 相反,Backbone.js 是否“使用 new 来产生副作用”? 【发布时间】:2014-02-05 21:39:35 【问题描述】:

我有一个独立的Backbone.View 实现,称为MainControllerView,它可以自行处理(即,没有理由对它进行外部引用。)。如果,在我的主要引导程序函数中,我像这样开始:

$(function() 
  new MainControllerView();
);

JSLint/JSHint 抱怨我正在使用“新的副作用”。阅读此警告表明上述内容被认为是臭代码。替代方法是根本不使用 new 而只是将构造函数作为函数调用,或者将其分配给变量。但是,直接调用我的MainControllerView() 作为函数而不使用new 会在主干代码中引发错误,因此这显然不是一个选项。在我看来,以下是更好的代码似乎完全错误:

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

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

【问题讨论】:

Is javascript 's "new" Keyword Considered Harmful? 的可能重复项 不是真正的重复。我不是在问 new 本身是否有害,我问的是在不将其分配给变量的情况下使用它是否有问题。 【参考方案1】:

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

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

JSLint 是一个非常自以为是的 linter;仅仅因为 Crockford 说某些东西不好或不应该使用,并不意味着这是一个普遍的真理。另外,他背后的推理更多的是它掩盖了更经典的 oo 外观背后的 Javascript 原型性质。

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

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

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

您可以使用 JSHint 的 unused: false 选项来抑制它。

或者你也可以设置nonew: false

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

/* jshint unused: false */

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

查看jshint documentation

【讨论】:

【参考方案2】:

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

我强烈建议您切换到 JSHint,这样您就不必担心 Crockford 关心的那些实际上不会让您的代码变得更糟的愚蠢事情。

【讨论】:

我实际上使用 JSHint,这是一个在分叉中幸存下来的警告。当然,我可以在 JSHint 中禁用它,我会这样做,但在我这样做之前我想更好地理解它。谢谢! 哦,没想到有人加入了 JSHint(我一定是在我的配置中禁用了它并忘记了)。【参考方案3】:

从第一次阅读您的代码的其他人的角度来看。构造函数通常用于创建一个新对象,然后您对其进行操作。看这个,似乎你只是做了一个新的 View,然后什么都不做就直接扔掉了。

所以是的,不管有没有 JS[L/H]int,这是一种“糟糕的代码味道”。看看这篇文章——

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

【讨论】:

以上是关于与 JSHint 相反,Backbone.js 是不是“使用 new 来产生副作用”?的主要内容,如果未能解决你的问题,请参考以下文章

与backbone.js的多对多关系事件

Backbone.js 如何与 PHP 一起使用

如何将backbone.js 与websockets/socket-io/nowjs 一起使用

在 Apache 或 IIS 中托管时将 Backbone.js 与 CouchDB 连接

是否有任何教“.sync”与服务器的 Backbone.js 教程?

Backbone.js应用基础