关键字“new”在JavaScript中有什么副作用?

我正在研究jQuery的插件,我收到了这个JSLint错误:

Problem at line 80 character 45: Do not use 'new' for side effects. (new jQuery.fasterTrim(this, options)); 

我没有太多运气找到有关此JSLint错误的信息或new可能产生的任何副作用。

我试过谷歌搜索 “不要使用’新’副作用。” 得到0结果。 Binging给了我2个结果,但它们都只引用了JSLint源代码。 希望这个问题会改变这一点。 🙂

更新#1:以下是上下文的更多来源:

  jQuery.fn.fasterTrim = function(options) { return this.each(function() { (new jQuery.fasterTrim(this, options)); }); }; 

更新#2:我使用Starter jQuery插件生成器作为我的插件的模板,其中包含该代码。

Travis,我是Starter网站背后的开发人员。

@Pointy击中了头部。 以这种方式编写Starter代码的原因是因为我们确实需要一个新对象,所以我们不需要在那时存储对它的引用。

只需更改命令即可

 (new jQuery.fasterTrim(this, options)); 

 var fT = new jQuery.fasterTrim(this, options); 

你会发现安抚JSLint。

Starter插件设置遵循jQuery UI模式,即在元素的data集中存储对象的引用。 所以这就是发生的事情:

  1. 创建新对象(通过新)
  2. 使用jQuery的data将实例附加到DOM元素: $(el).data('FasterTrim', this)

返回的对象没有用处,因此没有进行var声明。 我将研究更改声明和清理输出以开箱即用的JSLint。

更多背景

使用data存储对象的好处是我们可以随时通过调用: $("#your_selector").data('FasterTrim')来访问对象。 但是,如果您的插件不需要在流中途访问(意思是,它在一次调用中设置并且不提供将来的交互),则不需要存储引用。

如果您需要更多信息,请告诉我。

JsLint本身就是你的理由:

构造函数是旨在与新前缀一起使用的函数。 新前缀基于函数的原型创建一个新对象,并将该对象绑定到函数的隐含此参数。 如果忽略使用新前缀,则不会创建新对象,并且这将绑定到全局对象。 这是一个严重的错误。

JSLint强制执行构造函数为初始大写的名称的约定。 除非具有新的前缀,否则JSLint不希望看到具有初始大写名称的函数调用。 JSLint不期望看到用于名称不以初始大写字母开头的函数的新前缀。 这可以使用newcap选项进行控制。

JSLint不希望看到包装器形成新的Number,new String,new Boolean。

JSLint不期望看到新的Object(而是使用{})。

JSLint不希望看到新的数组(改为使用[])。

这是抱怨,因为你打电话给“新”但随后扔掉了退回的物品,我敢打赌。 为什么该代码使用“新”? 换句话说,为什么不是这样呢

 jQuery.fasterTrim(this, options); 

编辑确定,“Starter”工具生成代码,因为它确实需要创建一个新对象,是的,它确实是利用副作用。 “Starter”生成的构造函数代码使用jQuery“data”工具存储对受影响元素上的新对象的引用。

您正在使用new来执行某些操作,而不是创建对象并将其返回。 JSLint认为这是对new的无效使用。

你应该像这样使用它:

 var x = new SomeConstructor(); 

或者像这样执行一些操作:

 SomeMethod(); 

但是永远不要用new来执行这样的动作:

 new SomeCosntructor(args); 

这样做被认为是使用new作为副作用,因为您没有使用它来创建对象。

基本上JavaScript往往是一个缓慢的野兽,因此创建一个新对象只是为了调用一个函数是非常低效的。 无论如何,该function是静态的。

 $.fasterTrim(this, options); 

来自jQuery fasterTrim源代码 :

  * Usage: * * $(element).fasterTrim(options); // returns jQuery object * $.fasterTrim.trim(" string ", options); // returns trimmed string 

要回答这个问题,“不要使用新的副作用”意味着:

不要使用new作为构造函数对其参数执行的操作,而是创建一个对象,构造函数中的副作用是baaaad!