JSLint: использование функции до ее определенной ошибки - PullRequest
71 голосов
/ 30 апреля 2009

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

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

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

Ответы [ 8 ]

84 голосов
/ 01 марта 2012

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

/*jslint latedef:false*/
69 голосов
/ 30 апреля 2009

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

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

33 голосов
/ 28 мая 2014

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

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

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

/* jshint latedef:nofunc */

noop();

function noop() {}

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

11 голосов
/ 18 июля 2012

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

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

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

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

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

2 голосов
/ 06 мая 2016

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

  "latedef": "nofunc",
2 голосов
/ 21 августа 2014

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

{
   "latedef": false
}
1 голос
/ 21 января 2015

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

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

   function func {
      ...
   }
}

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

0 голосов
/ 04 мая 2013

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

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

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

init = function () { };

...