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

时间:2010-03-04 17:14:30

标签: javascript jquery jquery-plugins new-operator jslint

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

Problem at line 80 character 45: Do not use 'new' for side effects.

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

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

我已尝试Googling表示“请勿使用'new'作副作用。”得到0结果。 Binging给了我2个结果,但它们都只引用了JSLint源代码。希望这个问题会改变这一点。 : - )

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

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

更新#2: 我使用Starter jQuery plug-in generator作为插件的模板,其中包含该代码。

6 个答案:

答案 0 :(得分:15)

JsLint itself告诉你原因:

  

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

     

JSLint强制执行约定   构造函数被赋予名称   初始大写。 JSLint呢   不期望看到一个功能   以初始大写调用   名称,除非它有新的前缀。   JSLint不期望看到新的   前缀用于名称的函数   不要以初始大写开头。   这可以通过newcap来控制   选项。

     

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

     

JSLint不期望看到新的   对象(改为使用{})。

     

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

答案 1 :(得分:7)

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)
  3. 返回的对象没有用处,因此没有var声明。 我将研究更改声明并清理输出以便开箱即可传递JSLint。

    多一点背景

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

    如果您需要更多信息,请与我们联系。

答案 2 :(得分:6)

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

jQuery.fasterTrim(this, options);

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

答案 3 :(得分:5)

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

您应该像这样使用它:

var x = new SomeConstructor();

或执行以下操作:

SomeMethod();

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

new SomeCosntructor(args);

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

答案 4 :(得分:2)

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

$.fasterTrim(this, options);

答案 5 :(得分:0)

来自jQuery fasterTrim source code

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

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

  

不要使用new作为什么   构造函数将对其参数执行操作   但要创建一个对象,副作用   在建设者中是baaaad!