我在JS文件中遇到两个错误,都是“意外” - “。”它位于鼠标滚轮滚动的代码中(两次都为this.addEventListener( types[--i], handler, false );
)。我以前从未见过这种语法。它是什么,我应该如何纠正它,使JSLint更快乐?
(function($) {
var types = ['DOMMouseScroll', 'mousewheel'];
$.event.special.mousewheel = {
setup: function() {
var i;
if ( this.addEventListener ) {
i = types.length;
while ( i >= 0 ) {
this.addEventListener( types[--i], handler, false );
}
} else {
this.onmousewheel = handler;
}
},
teardown: function() {
if ( this.removeEventListener ) {
i = types.length;
while ( i >= 0 ) {
this.removeEventListener( types[--i], handler, false );
}
} else {
this.onmousewheel = null;
}
}
};
答案 0 :(得分:6)
--n
语法递减变量。您可能已经看到的更为常见的是n++
,它是相似的,但会增加变量。
--
或++
可以出现在变量之前或之后,并且存在细微差别。当它出现时,它会改变该值,然后返回更改后的值。当它出现时,它返回原始值。直接使用该值时,这会产生影响。
var i;
// affix
i = 1; console.log(i++, i) // 1 2
i = 1; console.log(i--, i) // 1 0
// prefix
i = 1; console.log(++i, i) // 2 2
i = 1; console.log(--i, i) // 0 0
注意前缀增量或减量表达式的值如何在操作后为i返回相同的值,而词缀版本则没有。
所以,长话短说,JSLint并不喜欢前缀增量运算符。但这应该是等价的:
while ( i >= 0 ) {
i -= 1;
this.removeEventListener( types[i], handler, false );
}
如果不使用递减操作的直接结果,那么操作符的工作方式和返回的内容就不再重要了。它也更明确,JSLint喜欢显式。
答案 1 :(得分:3)
JSLint拒绝所有运算符--i
,i--
,++i
和i++
。
只需添加一行
i -= 1;
在两行中出现错误并将--i
替换为i
,并且JSLint应该感到高兴。
--i
在执行周围语句之前将变量i减少一个。使用它的代码的可读性比没有它的代码更糟糕。这就是为什么JSLint不鼓励使用它的原因。
答案 2 :(得分:1)
改变这个:
while ( i >= 0 ) {
this.addEventListener( types[--i], handler, false );
}
对此:
while ( i >= 0 ) {
i -= 1;
this.addEventListener( types[i], handler, false );
}
变量前面的--
运算符在使用前递减变量的值,将新值存储到变量中。因此,--i
是预先减少的,并且意味着“将i
设置为i-1
的值,然后继续执行您要对i
进行的操作”< / em>的。相反的操作将是后递减(i--
),这意味着“使用i
作为当前操作,然后将其设置为值i-1
”
Crockford默认JSLint拒绝这种操作,因为他认为它令人困惑,难以阅读,而且维护较少。您还可以将配置LINT工具的路径设置为“Tolerate - and ++”(LINT属性plusplus: true
)。但是,在您的情况下,对代码的调整很小,因此编辑可能更可取。
答案 3 :(得分:1)
将行更改为:
this.addEventListener( types[i -= 1], handler, false );
使JSLint感到高兴。
请参阅Why avoid increment ("++") and decrement ("--") operators in JavaScript?和post increment vs pre increment - Javascript Optimization(以及其他人通过Google搜索“前后增量javascript”)了解++和 - 实际上是做什么。