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

StackOverflow https://stackoverflow.com/questions/806163

  •  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 = функция() { };

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top