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

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

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

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


person Chris S    schedule 30.04.2009    source источник


Ответы (8)


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

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

person Steve Harrison    schedule 30.04.2009
comment
Я также предпочитаю метод init поверх. Итак, функции, которые он использует, идут ниже. Как игнорировать или взломать эту ошибку, поскольку она не позволяет мне видеть следующие ошибки JsLint в коде? Я хочу, чтобы общий подход сохранил мой стиль, но не вижу этой ошибки. - person Zon; 11.01.2016

Поскольку это хит Google с самым высоким рейтингом, и другие люди могут сначала не увидеть его в инструменте jslint, существует параметр «Допускать неправильно упорядоченные определения», который позволяет вам скрыть этот тип ошибки.

/*jslint latedef:false*/
person kontur    schedule 01.03.2012
comment
Установка этого параметра на true, похоже, не решает эту проблему для меня. - person Markus Amalthea Magnuson; 13.12.2012
comment
У меня та же проблема, что и у Маркуса. - person M. Herold; 23.05.2013
comment
Не могли бы вы поделиться своим javascript? @ М. Герольд - person kontur; 24.05.2013
comment
@PeterMajeed Нет, это не так. Крис не спрашивает о том, как терпеть неправильно упорядоченные определения. - person borisdiakur; 14.01.2014

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

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

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

/* jshint latedef:nofunc */

noop();

function noop() {}

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

person Jan Molak    schedule 28.05.2014
comment
Это решение 2014 года. - person Deathspike; 04.07.2014
comment
Это решение только для jshint? Я использую Brackets и получаю много предупреждений о ворсе. Должен линт быть совместим с этим решением подсказки. У меня не получилось. - person Andreas Jansson; 16.10.2014

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

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

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

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

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

person stanton    schedule 18.07.2012
comment
Также для меня слово global должно быть сразу после звездочки, без пробелов, иначе оно будет проигнорировано. - person Carl Pritchett; 03.09.2013

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

{
   "latedef": false
}
person Dmitri Zaitsev    schedule 21.08.2014

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

  "latedef": "nofunc",
person mooses    schedule 06.05.2016

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

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

   function func {
      ...
   }
}

Этот стиль очень распространен, но не проходит через jsLint, потому что func «используется» до определения. Необходимость использовать global для каждой функции «член» - это полная боль.

person kofifus    schedule 21.01.2015

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

например: вар инициализации;

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

инициализация = функция () {};

person jcsubmit    schedule 04.05.2013
comment
Предупреждение: init = function(){} не то же самое, что function init() {} ECMAScript имеет другие правила для анонимных функций, это первое. - person Ron Wertlen; 17.10.2013