关键字';新';你有JavaScript语言吗?
我正在为jQuery开发一个插件,我遇到了以下错误: 我还没有找到关于这个JSLint错误或关键字';新';你有JavaScript语言吗?,javascript,jquery,jquery-plugins,new-operator,jslint,Javascript,Jquery,Jquery Plugins,New Operator,Jslint,我正在为jQuery开发一个插件,我遇到了以下错误: 我还没有找到关于这个JSLint错误或new可能产生的任何副作用的信息 我试过“不要用‘新’来处理副作用”,结果是0。给出了2个结果,但它们都只是引用了JSLint源代码。希望这个问题能改变这一点。:-) 更新#1: 以下是上下文的更多来源: jQuery.fn.fasterTrim = function(options) { return this.each(function() { (new jQuery.fast
new
可能产生的任何副作用的信息
我试过“不要用‘新’来处理副作用”,结果是0。给出了2个结果,但它们都只是引用了JSLint源代码。希望这个问题能改变这一点。:-)
更新#1:
以下是上下文的更多来源:
jQuery.fn.fasterTrim = function(options) {
return this.each(function() {
(new jQuery.fasterTrim(this, options));
});
};
更新#2:
我使用作为插件的模板,插件中包含该代码。它抱怨是因为您调用了“new”,但我敢打赌,随后丢弃了返回的对象。为什么代码使用“new”?换句话说,为什么它不只是
jQuery.fasterTrim(this, options);
编辑好的,“启动程序”工具以这种方式生成代码,因为它确实希望创建一个新对象,是的,它确实是为了利用副作用。“Starter”生成的构造函数代码使用jQuery“data”功能将对新对象的引用隐藏在受影响的元素上。您使用的是
new
执行一些操作,而不是创建对象并返回它。JSLint认为这是对new
的无效使用
您可以这样使用它:
var x = new SomeConstructor();
SomeMethod();
new SomeCosntructor(args);
或者执行如下操作:
var x = new SomeConstructor();
SomeMethod();
new SomeCosntructor(args);
但切勿使用new来执行以下操作:
var x = new SomeConstructor();
SomeMethod();
new SomeCosntructor(args);
这样做被认为是使用
new
来产生副作用,因为您没有使用它来创建对象。基本上JavaScript是一个缓慢的野兽,因此创建一个新对象只是为了调用一个函数是非常低效的。不管怎样,函数是静态的
$.fasterTrim(this, options);
给你一个理由:
构造函数是
设计用于新的
前缀新前缀将创建一个新的前缀
基于函数的
原型,并将该对象绑定到
函数的隐含参数是这个参数。
如果忽略使用新前缀,
不会制造新对象,并且此
将绑定到全局对象。
这是一个严重的错误
JSLint强制执行以下约定:
构造函数不能被命名
首字母大写。JSLint有
不期望看到一个函数
以大写字母开头的调用
名称,除非它有新的前缀。
JSLint不希望看到新的
与名称相同的函数一起使用的前缀
不要以大写字母开头。
这可以用newcap控制
选择权
JSLint不希望看到
包装器形成新的数字,新的字符串,
新布尔值
JSLint不希望看到新的
对象(改为使用{})
JSLint不希望看到新的
数组(改为使用[])
发件人:
回答这个问题,“不要使用新的药物治疗副作用”是指: 不要使用新的用于 构造函数将对其参数进行修改 但是要创建一个对象,副作用 在建设者是BAAAD
Travis,我是
Starter
站点的开发者
@尖头击中了头上的钉子。这样编写启动程序代码的原因是因为我们确实需要一个新对象,我们不需要在该点上存储对它的引用
只需将命令从
(new jQuery.fasterTrim(this, options));
到
正如你所发现的那样,会安抚JSLint
Starter插件设置遵循jQueryUI模式,将对象的引用存储在元素的数据集中。这就是正在发生的事情:
创建新对象(通过新建)
使用jQuery的data
:$(el.data('FasterTrim',this)
返回的对象没有任何用处,因此没有进行var
声明。我将研究如何更改声明并清理输出,以便将JSLint从盒子中传递出去
再多一点背景知识:
使用数据存储对象的好处在于,我们可以在以后的任何时候通过调用:$(“#您的#选择器”).data('FasterTrim')
来访问对象。然而,如果您的插件不需要以这种方式在中途访问(也就是说,它只需一次调用就可以建立起来,并且不会提供未来的交互),那么就不需要存储引用
如果您需要更多信息,请告诉我。好吧,他正在创建一个对象,但他正在将其扔掉:-)我更新了问题以显示周围的源代码,源于起始代码。我仍然不理解。我如何创建一个类似于原型PeriodicalExecuter的东西?推荐的API未通过此jslint检查。这些指南是针对最佳实践的。原型库不遵循这种特殊的实践。所以,你得将就一下。您可以保留错误,也可以将结果分配给局部变量,即使您不使用它。我更新了问题以显示周围的源代码,源于启动程序代码。js lint检测到的问题是创建一个新对象并将其丢弃。基本上,jslint假设返回值未存储的新调用必须引起副作用(否则为什么要实例化它),而具有副作用的构造函数通常是糟糕的设计。Js lint告诉您fastTrim使用了糟糕的设计。只需使用$.fasterTrim(“Hello”)@Juan嗯,看起来“初学者”工具生成了这些代码,所以提问者基本上就是这些东西的受害者。我刚才自己也用过这个页面,很确定这就是它给你的模式。我不知道为什么。也许有更好的方法,虽然我不是形式主义者,所以我不能开任何处方。如果您使用的是Starter工具(看起来真的没那么糟糕),那么您可能希望忽略这个JSLint错误。在我看来,初学者代码恰好做到了这一点并不是那么邪恶。关于构造函数,有副作用是件坏事,这是一个有趣的观点。我是