【问题标题】:JSLint Error: Unexpected '--'JSLint 错误:意外的“--”
【发布时间】:2012-02-29 07:03:13
【问题描述】:

我在一个 JS 文件中遇到两个错误,都是“意外 '--'”。它在鼠标滚轮滚动的代码中(两次都是 this.addEventListener( types[--i], handler, false ); )。我以前从未在任何地方看到过这种 --i 语法。它是什么,我应该如何纠正它以使其正确,并使 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;
        }
    }
};

【问题讨论】:

  • 有一个设置可以让 JSLint 不再对已经存在了几十年的 ++ 等运算符感到愚蠢
  • 不要因为这个警告而改变你的代码! JSLint 是一个刺,并且永远是一个刺。此外,如果您正在完善您想要共享但不感到羞耻的可重用代码/插件,它也会非常有用。
  • 我倾向于同意 Crockford 在这个特定的检查中是主观的。也就是说,我不认为他是愚蠢的或“混蛋”。说他是这样的,同样是主观的。

标签: javascript jquery syntax jslint


【解决方案1】:

JSLint 拒绝所有运算符 --ii--++ii++

只需添加一行

i -= 1;

在两行出现错误之前,将 --i 替换为 i,JSLint 应该会很高兴。

--i 在执行周围语句之前将变量 i 减一。使用它的代码的可读性比没有它的代码差。这就是 JSLint 不鼓励使用它的原因。

【讨论】:

    【解决方案2】:

    改变这个:

    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 做的事情”。相反的操作将是一个后减量 (i--),这意味着 “将 i 原样用于当前操作,然后将其设置为 i-1 的值”

    Crockford 默认 JSLint 拒绝这种操作,因为他认为这种操作令人困惑、难以阅读且不易维护。您还可以将 LINT 工具配置为“Tolerate -- and ++”(LINT 属性plusplus: true)。但是,在您的情况下,对代码的调整很小,因此编辑可能更可取。

    【讨论】:

      【解决方案3】:

      改行改为:

      this.addEventListener( types[i -= 1], handler, false );
      

      让 JSLint 开心。

      请参阅 Why avoid increment ("++") and decrement ("--") operators in JavaScript?post increment vs pre increment - Javascript Optimization(以及其他通过谷歌搜索“pre and post increment javascript”)了解 ++ 和 -- 的实际作用。

      【讨论】:

      • JSLint 拒绝众所周知的递增/递减运算符似乎有点奇怪,但也不坚持 i-=1 自行上线 - 在我看来 types[i-=1]较少可读...
      【解决方案4】:

      --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 喜欢显式。

      【讨论】:

      • 另外,在某些实现中,我相信前缀会稍微快一些。这是一个微优化,在绝大多数情况下都无关紧要,但是使用前缀而不是后缀(或词缀)递增/递减运算符很可能是由于这个毫无意义的原因。很好的解释。
      猜你喜欢
      • 2016-03-01
      • 2015-07-30
      • 2015-02-09
      • 2012-10-21
      • 2011-03-01
      • 1970-01-01
      • 2018-06-21
      • 1970-01-01
      相关资源
      最近更新 更多