JSLint:Ошибка использования функции до ее определения
-
03-07-2019 - |
Вопрос
Я использую JSLint для проверки большинства моих внешних файлов Javascript, но наибольшее количество ошибок, которые я получаю, связано с функциями, используемыми до их определения.
Действительно ли это проблема, о которой я должен беспокоиться?
Похоже, Firefox, IE7 и Chrome это не волнует.Функции, подобные популярным init()
(который я часто использую) обычно помещается сверху, поскольку для меня это имеет смысл (мне нравится притворяться, что это аналогично main()
), согласно JSLint, нужно будет поместить в нижнюю часть файла.
Решение
Если вы объявляете функции, используя function
ключевое слово, вы можете использовать их до того, как они будут объявлены.Однако, если вы объявляете функцию с помощью другого метода (например, используя функциональное выражение или Function
constructor), вы должны объявить функцию, прежде чем использовать ее.Видишь эта страница дополнительную информацию можно получить в сети разработчиков Mozilla.
Предполагая, что вы объявляете все свои функции с помощью function
ключевое слово, я думаю, это становится вопросом в стиле программирования.Лично я предпочитаю структурировать свои функции таким образом, чтобы это казалось логичным и делало код максимально читаемым.Например, как и вы, я бы поставил init
работайте на самом верху, потому что именно с него все начинается.
Другие советы
Поскольку это самый популярный хит Google и другие люди могут сначала не увидеть его в инструменте jslint, есть опция под названием "Допускать неправильные определения", которая позволяет скрыть ошибки такого типа.
/*jslint latedef:false*/
Если вы используете jshint, вы можете установить latedef
Для nofunc
, который будет игнорировать только поздние определения функций.
Документация - http://www.jshint.com/docs/options/#latedef
Пример использования:
/* jshint latedef:nofunc */
noop();
function noop() {}
Надеюсь, это поможет.
С веб-сайта jslint (http://www.jslint.com/lint.html), вы можете прочитать о директиве /* global * /, которая позволяет вам устанавливать переменные, которые, как предполагается, объявлены в другом месте.
Вот пример (поместите его в начало файла):
/*global var1,var2,var3,var4,var5*/
По моему опыту, значение :true : false на самом деле не требуется, но, похоже, это рекомендуется из того, что я прочитал на сайте.
Убедитесь, что начальный глобальный оператор находится в той же строке, что и /*
, иначе он сломается.
Чтобы отключить это предупреждение в jshint
для всех файлов поместите это в свой .jshintrc
файл:
{
"latedef": false
}
В вашем .jshintrc
файл, установленный:
"latedef": "nofunc",
очень жаль, что опция latedef была удалена.Это важно при попытке создать "класс" с интерфейсом вверху, т.е.,
function SomeClass() {
var self = this;
self.func = func;
function func {
...
}
}
Этот стиль очень распространен, но не передает JSLint, потому что функция "используется" перед определением.Необходимость использовать глобальную для каждой функции-члена - это сплошная боль.
Вы всегда можете объявить функцию-нарушитель вверху
например:var инициализация;
....но тогда вам придется удалить "var", когда вы перейдете к истинному определению ниже:
init = функция() { };