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

tra*_*vis 20 javascript jquery jslint jquery-plugins new-operator

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

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

(new jQuery.fasterTrim(this, options));
Run Code Online (Sandbox Code Playgroud)

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

我试过谷歌搜索 "不要使用'新'副作用." 得到0结果.Binging给了我2个结果,但他们都只引用了JSLint源代码.希望这个问题会改变这一点.:-)

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

  jQuery.fn.fasterTrim = function(options) {
    return this.each(function() {
      (new jQuery.fasterTrim(this, options));
    });
  };
Run Code Online (Sandbox Code Playgroud)

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

Elz*_*ugi 15

JsLint本身就是你的理由:

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

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

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

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

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


Dou*_*ner 7

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

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

只需更改命令即可

(new jQuery.fasterTrim(this, options)); 
Run Code Online (Sandbox Code Playgroud)

var fT = new jQuery.fasterTrim(this, options);
Run Code Online (Sandbox Code Playgroud)

你会发现安抚JSLint.

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

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

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

更多背景:

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

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


Poi*_*nty 6

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

jQuery.fasterTrim(this, options);
Run Code Online (Sandbox Code Playgroud)

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

  • 那么可能有更好的方法来做到这一点,虽然我不是形式主义所以我不能开处方.如果您使用的是Starter工具(实际上看起来并不那么糟糕),您可能只想忽略该JSLint错误.对我来说,Starter代码碰巧这样做似乎并不完全是邪恶的. (2认同)

End*_*ssa 5

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

你应该像这样使用它:

var x = new SomeConstructor();
Run Code Online (Sandbox Code Playgroud)

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

SomeMethod();
Run Code Online (Sandbox Code Playgroud)

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

new SomeCosntructor(args);
Run Code Online (Sandbox Code Playgroud)

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