关键字“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
集中存储对象的引用。 所以这就是发生的事情:
- 创建新对象(通过新)
- 使用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!