JSLint: использование функции перед ее определением ошибки

Я использую JSLint для проверки большинства моих внешних файлов Javascript, но наибольшее количество ошибок, которые я получаю, - это функции, которые используются до их определения.

Это действительно проблема, о которой я должен беспокоиться о?

Кажется, Firefox, IE7 и Chrome не заботятся. Такие функции, как популярный init() (который я часто использую), обычно придерживаются сверху, поскольку это имеет смысл для меня (мне нравится притворяться, что это аналогично main()), в соответствии с JSLint, нужно подтолкнуть к нижней части файл.

Ответ 1

Если вы объявляете функции с помощью ключевого слова function, вы можете использовать их до их объявления. Однако, если вы объявляете функцию с помощью другого метода (например, с помощью выражения функции или конструктора function), вы должны объявить функцию перед ее использованием. См. эту страницу в Mozilla Developer Network для получения дополнительной информации.

Предполагая, что вы объявляете все свои функции с помощью ключевого слова function, я думаю, что это становится вопросом стиля программирования. Лично я предпочитаю структурировать свои функции таким образом, который кажется логичным и делает код максимально читаемым. Например, как и вы, я положил бы функцию init вверху, потому что там, где все начинается.

Ответ 2

Поскольку это рейтинг с рейтингом google и другие люди, возможно, не видят его сначала в инструменте jslint, есть опция под названием "Tolerate misordered definition", которая позволяет вам скрывать этот тип ошибок.

/*jslint latedef:false*/

Ответ 3

Если вы используете jshint, вы можете установить latedef в nofunc, который будет игнорировать только описания поздних функций.

Документация - http://www.jshint.com/docs/options/#latedef

Пример использования:

/* jshint latedef:nofunc */

noop();

function noop() {}

Надеюсь, что это поможет.

Ответ 4

На веб-сайте jslint (http://www.jslint.com/lint.html) вы можете прочитать о /* глобальной директиве */, которая позволяет вам устанавливать переменные, которые предположительно объявляются в другом месте.

Вот пример (поместите это в начало файла):

/*global var1,var2,var3,var4,var5*/

The: true: false на самом деле не требуется из моего опыта, но похоже, что он рекомендуется из того, что я читал на сайте.

Убедитесь, что исходный глобальный оператор находится в той же строке, что и /*, иначе он сломается.

Ответ 5

Чтобы отключить это предупреждение в jshint для всех файлов, поместите это в свой файл .jshintrc:

{
   "latedef": false
}

Ответ 6

В вашем файле .jshintrc установите:

  "latedef": "nofunc",

Ответ 7

Очень неудачно, что опция latedef была удалена. Это важно при попытке создать "класс" с интерфейсом вверху, т.е.

function SomeClass() {
   var self = this;
   self.func = func;

   function func {
      ...
   }
}

Этот стиль очень распространен, но не передает jsLint, потому что func "используется" до его определения. Необходимость использования глобальной для каждой функции "члена" является полной болью.

Ответ 8

Вы всегда можете объявить оскорбительную функцию в верхней части

например: var init;

.... но тогда вам придется удалить "var", когда вы дойдете до истинного определения ниже:

init = function() { };