JSLint类型混淆:jQuery .css()的函数和对象
我很难让这些行使用JSLint进行validation。 我假设(可能不正确)他们实际上是有效的。 这是相关的代码:
var shadowBox = $('').appendTo($(document.body)); // ... shadowBox.css({ left: (e.originalEvent.clientX + 10).toString() + 'px', top: e.originalEvent.clientY.toString() + 'px' });
我得到的validation错误是:
第492行的问题字符22:键入confusion:function和.css:object。
shadowBox.css({
和
第494行问题57:输入混淆:数字和’+’:字符串。
顶部:e.originalEvent.clientY.toString()+’px’
我对第一个问题更感到困扰,因为这是一个相当常见的jQuery语法。 第二个似乎是误报,因为我将字符串与字符串连接起来。
谢谢
编辑
弄清楚问题:
事实certificate,JSLint对同一文档中存在的这两种语法模式不满意:
var $var = $('', {css: {width: '15px'}}); // ONE $var.css({width : '20px'}); // TWO
来自jslint :输入Confusion
JSLint可以进行类型推断。 它可以报告案例变量和属性用于容纳多种类型。 警告是类型混淆:{a}和{b}。 其中{a}和{b}将替换为类型名称。
通常很容易看出导致警告的原因。 在某些情况下,它可能非常令人费解。 在令人费解的情况下,尝试使用类型值初始化变量。 例如,如果您希望n包含数字,那么写
var n = 0;
这应该产生更明确的警告。
类型混淆不一定是错误 ,特别是在提供与此类型一样多的类型自由的语言中。 但是一些不一致是错误,因此类型规则可能会考虑添加到您的编程风格。 此外,最快的JavaScript引擎会在类型混乱的情况下放慢速度。 要关闭这些警告,请启用“ 容忍类型”混淆选项 。
var shadowBox = $('').appendTo($(document.body)); // ... $(shadowBox).css({ left: String.concat(e.originalEvent.clientX + 10).toString(), 'px'), top: String.concat(e.originalEvent.clientY.toString(), 'px') });
对于第二个错误,您可以使用string.concat(e.originalEvent.clientY.toString(),’px’)或忽略错误。 jslint是一种检测不良做法的工具,但远非完美的工具。
顺便说一句,有一个jsvalidation器比jslint更好: jshint 。 它没有先生的规则。 crockford喜欢,它有更好的javascript规则。
事实certificate,JSLint增加了他们的“类型混淆”规则。
而我认为类型混淆的定义纯粹是这样的:
var a = 1; var b = a + 'string';
事实certificate这也被Crockford先生认为是混淆(我并不特别同意他)
function MyObject () { this.top() { return '15px'; } } var anonObject = {top: '15px'}; var myObject = new MyObject(); var testString = myObject.top();
或者是jQuery上下文中一个更简单的例子
var $b = $('').css({top: '15px'}), a = $b.offset().top + 15;
我的印象是类型混淆只涉及在范围内改变价值的标识符。 虽然克劳福德先生似乎认为:
来自:Douglas Crockford
主题:Re:JSLint类型问题
致:“Anthony S.”
日期:2011年6月23日,星期四,上午11:44
你似乎对什么类型的混淆感到困惑。 如果您不想看到警告,那么您不必这样做。
关于第一个,是shadowBox.css实际上是一个函数吗? 你把它称为好像。 编辑 :是的,因为这是一个常规的jQuery对象,你正确使用.css
。 /编辑
关于第二个,这看起来对我有用,虽然你没有给出任何背景。
请注意,jslint不能很好地理解有效的JS,我总是建议不要使用它。