21

我正在为 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 插件生成器作为我的插件的模板,其中包含该代码。

4

6 回答 6

15

JsLint 本身给了你原因:

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

JSLint 强制约定构造函数的名称以大写开头。JSLint 不希望看到具有初始大写名称的函数调用,除非它具有新的前缀。JSLint 不希望看到与名称不以首字母大写开头的函数一起使用的新前缀。这可以通过 newcap 选项来控制。

JSLint 不希望看到包装形式 new Number、new String、new Boolean。

JSLint 不希望看到新对象(使用 {} 代替)。

JSLint 不希望看到新的 Array(使用 [] 代替)。

于 2010-03-04T17:20:17.680 回答
7

Travis,我是该Starter网站的开发者。

@Pointy 一针见血。以这种方式编写 Starter 代码的原因是因为我们确实需要一个新对象,我们只是不需要在那时存储对它的引用。

只需将命令从

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

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

如您所见,将安抚 JSLint。

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

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

返回的对象没有用处,因此没有var声明。我将考虑更改声明并清理输出以使 JSLint 开箱即用。

多一点背景

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

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

于 2010-03-04T20:57:14.040 回答
6

我敢打赌,它之所以抱怨,是因为您正在调用“新”,但随后又扔掉了返回的对象。为什么该代码使用“新”?换句话说,为什么不只是

jQuery.fasterTrim(this, options);

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

于 2010-03-04T17:17:34.893 回答
6

您正在使用new执行某些操作而不是创建对象并返回它。JSLint 认为这是对new.

您应该像这样使用它:

var x = new SomeConstructor();

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

SomeMethod();

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

new SomeCosntructor(args);

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

于 2010-03-04T17:18:15.283 回答
2

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

$.fasterTrim(this, options);
于 2010-03-04T17:18:17.830 回答
0

来自jQuery fasterTrim 源代码

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

要回答这个问题,“不要使用新的副作用”是指:

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

于 2010-03-04T17:26:29.180 回答