JSLint: использование функции до ее определения ошибка
Я использую JSLint для проверки большинства моих внешних файлов Javascript, но наибольшее количество ошибок я получаю от функций, используемых до их определения.
Это действительно проблема, о которой я должен беспокоиться?
Кажется, Firefox, IE7 и Chrome не заботятся. Функции, как популярные init()
(который я использую часто) обычно придерживаться в верхней части, как это имеет смысл для меня (мне нравится делать вид, что это аналогично main()
), согласно JSLint, нужно нажать на нижнюю часть файла.
8 ответов:
если вы объявляете функции с помощью
function
ключевое слово, вы можете использовать их, прежде чем они объявили. Однако, если вы объявляете функцию с помощью другого метода (например, с помощью выражения функции илиFunction
конструктор), вы должны объявить функцию перед ее использованием. Смотрите на этой странице в сети разработчиков Mozilla для получения дополнительной информации.предполагая, что вы объявляете все свои функции с помощью
function
ключевое слово, я думаю, что это становится вопросом стиля программирования. Лично я предпочитаю структурировать свои функции таким образом, который кажется логичным и делает код максимально читаемым. Например, как вы, я бы поставилinit
функции на вершине, потому что это, где все начинается.
поскольку это самый популярный хит google, и другие люди могут не видеть его сначала в инструменте jslint, есть опция "терпеть неправильные определения", которая позволяет скрыть этот тип ошибки.
/*jslint latedef:false*/
Если вы используете jshint вы можете установить
latedef
tonofunc
, который будет игнорировать только поздние определения функций.документация 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*/
the :true: false на самом деле не требуется из моего опыта, но похоже, что это рекомендуется из того, что я читал на сайте.
убедитесь, что исходный глобальный оператор находится на том же строка как
/*
, иначе она сломается.
отключить это предупреждение в
jshint
для всех файлов, поместите это в ваш.jshintrc
file:{ "latedef": false }
очень жаль, что опция latedef была удалена. Это важно при попытке создать "класс" с интерфейсом в верхней части, т. е.
function SomeClass() { var self = this; self.func = func; function func { ... } }
этот стиль очень распространен, но не передает jsLint, потому что func "используется" перед определением. Необходимость использовать global для каждой функции "члена" - это полная боль.