Предложения JSLint для циклов for

Я создал цикл for в JavaScript, который выглядит следующим образом:

for (var i = 0; i < element[child].length; i++) {
    ...some code...
}

Однако, когда я запускаю на нем JSLint, он жалуется, что «var i» следует переместить в начало функции (что мне кажется странным), а также жалуется, что ++ в «i++» является неожиданным. Именно эту часть я действительно нахожу странной - почему ++ неожидан и чем его следует заменить?


person user5013    schedule 15.10.2013    source источник
comment
Дуглас Крокфорд (который написал JSLint) почему-то предпочитает i = i + 1. Вы можете переключить параметр, чтобы разрешить i++, используя параметр plusplus: true. Объявление var в верхней части функции, скорее всего, связано с подъемом. Я не знаю, что для этого есть опция JSLint.   -  person Andy    schedule 15.10.2013
comment
Пока я думаю об этом, я на самом деле нахожу поднятие объявлений переменных очень удобным, если я пишу сложный фрагмент кода. Когда я вижу, что я объявил их большое количество, я могу начать проверять, нужно ли разбивать функцию на более мелкие компоненты.   -  person Andy    schedule 15.10.2013


Ответы (3)


Говорит переместить var i наружу. Это должно быть что-то вроде:

function foo() {
    "use strict";
    var i, element, child;

    //...set element/child...

    for (i = 0; i < element[child].length; i += 1) {
        //...some code...
    }
}

Здесь есть хороший пост, посвященный теме ++: Зачем избегать увеличения (+ +) и декремент (--) в JavaScript?

person epascarello    schedule 15.10.2013

Переменные должны быть объявлены в верхней части функции, потому что это то, что в любом случае делает JavaScript (это известно как «поднятие переменных»), поэтому JSLint считает, что всегда иметь их там ясно.

Что касается i++, он хочет, чтобы вы использовали i += 1. Из документов JSLint:

Известно, что операторы ++ (увеличение) и -- (уменьшение) способствуют созданию плохого кода, поощряя чрезмерную хитрость. Они уступают только ошибочной архитектуре в отношении вирусов и других угроз безопасности. Кроме того, путаница между преинкрементом и постинкрементом может привести к ошибкам, которые чрезвычайно трудно диагностировать. Существует опция plusplus, которая позволяет использовать эти операторы.

Короче говоря, JSLint считает это злом, что вызывает споры. См. также: http://jslinterrors.com/unexpected-plus-plus/

person bfavaretto    schedule 15.10.2013
comment
Есть ли причина, по которой Дуглас Крокфор не одобряет ++? К каким ошибкам, по его мнению, это тоже может привести? - person user5013; 15.10.2013
comment
В основном он думает, что это может привести к (логической) путанице. Кроме того, это может привести к ошибкам (см. stackoverflow.com/ вопросы/14325011/). Мне лично нравятся эти операторы, Крокфорд слишком радикален. - person bfavaretto; 15.10.2013

Честно говоря, я думаю, что ваш код в порядке, и проблема больше в том, что JSLint слишком придирчив. Когда я запускаю ваш код через JSHint, у меня не возникает проблем: http://www.jshint.com/

Помните, что JSLint часто будет очень придирчивым, даже если что-то все еще работает правильно. Просто нужно знать, когда прислушаться к его совету, а когда его проигнорировать :)

person cardern    schedule 15.10.2013