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


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

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

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

8 71

8 ответов:

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

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

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

/*jslint latedef:false*/

Если вы используете jshint вы можете установить latedef to 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*/

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

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

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

{
   "latedef": false
}

в своем .jshintrc file, set:

  "latedef": "nofunc",

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

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

   function func {
      ...
   }
}

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

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

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

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

init = функция() { };