JSLint: Використання функції перед визначеною помилкою


74

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

Це справді проблема, про яку я повинен хвилюватися ?

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

Відповіді:


69

Якщо ви оголошуєте функції за допомогою functionключового слова, ви можете використовувати їх до їх оголошення. Однак, якщо ви оголошуєте функцію за допомогою іншого методу (наприклад, використовуючи вираз функції або Functionконструктор), вам потрібно оголосити функцію перед тим, як використовувати її. Для отримання додаткової інформації див. Цю сторінку в мережі розробників Mozilla.

Якщо припустити, що ви оголошуєте всі свої функції за допомогою functionключового слова, я думаю, це стає питанням у стилі програмування. Особисто я вважаю за краще структурувати свої функції таким чином, що здається логічним і робить код максимально читабельним. Наприклад, як і ви, я б поставив initфункцію вгорі, бо саме з неї все починається.


2
Я також надаю перевагу методу init. Тож функції, які він використовує, йдуть нижче. Як ігнорувати або зламати цю помилку, оскільки вона заважає мені бачити наступні помилки JsLint у коді? Я хочу загальний підхід, щоб зберегти свій стиль, але не бачу цієї помилки.
Zon

86

Оскільки це найвищий рейтинг відвідувачів Google, і інші люди можуть не бачити його спочатку в інструменті jslint, існує опція під назвою "Дозволити неправильно впорядковані визначення", яка дозволяє приховати такий тип помилок.

/*jslint latedef:false*/

5
Якщо встановити цей параметр true, здається, не "вирішує" цю проблему для мене.
Маркус Амальтея Магнусон

У мене така ж проблема, як у Маркуса.
М. Герольд

Не могли б ви поділитися своїм javascript? @ M.Herold
kontur

4
@PeterMajeed Ні, це не так. Кріс не запитує про те, як терпіти неправильні визначення.
borisdiakur

33

Якщо ви використовуєте jshint, ви можете встановити latedefзначення nofunc, яке ігноруватиме лише пізні визначення функцій.

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

Приклад використання:

/* jshint latedef:nofunc */

noop();

function noop() {}

Сподіваюся, це допомагає.


Це рішення 2014 року.
Хозукі

2
Це рішення лише для jshint? Я використовую "дужки" і отримую багато попереджень про ворсинки. Чи має ворсинка бути сумісною з цим рішенням для підказок. Я не змусив це працювати.
Андреас Янссон,

11

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

Ось приклад (поставте це у верхній частині файлу):

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

: True: false насправді не потрібно з мого досвіду, але схоже, що це рекомендується з того, що я прочитав на сайті.

Переконайтесь, що початковий глобальний оператор знаходиться в тому ж рядку /*, що інакше, або він ламається.


3
Також для мене слово global має бути безпосередньо після зірочки, без пробілів, інакше воно буде ігноруватися.
Carl Pritchett 02

2

Щоб вимкнути це попередження jshintдля всіх файлів, помістіть це у свій .jshintrcфайл:

{
   "latedef": false
}


1

дуже прикро, що латед-варіант вилучили. Це важливо при спробі створити "клас" з інтерфейсом вгорі, тобто

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

   function func {
      ...
   }
}

Цей стиль дуже поширений, але не передає jsLint, оскільки функція "використовується" перед визначенням. Необхідність використання глобальної функції для кожної функції "член" - це суцільний біль.


0

Ви завжди можете оголосити порушувальну функцію вгорі

наприклад: var init;

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

init = function () {};


2
Попередження: init = function(){} це не те саме, що function init() {}ECMAScript має різні правила для анонімних функцій, це те, що є першим.
Рон Вертлен,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.