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() {
};