В моем проекте (только для браузера) Я хочу использовать инструмент качества кода JS. Я пробовал оба jslint
и eslint
. Я хочу, чтобы linter помог мне сделать мой код чистым, ясным, защищенным от ошибок и улучшить его общее качество. То, что я не хочу делать, это то, что я не хочу писать какие-то грязные хаки или использовать плохие практики, чтобы сделать линт счастливым.Определение функций JavaScript
Меня беспокоит только одна проблема. Оба они сообщили о проблеме, что я использую функцию до ее определения. Очевидно, что в следующем фрагменте кода bar
не будет вызываться до его определения.
function foo() {
bar();
}
function bar() {
}
foo();
В этом простейшем случае можно просто переместить bar
перед тем foo
. Но бывают случаи, когда это просто невозможно. Первая функция использует вторую, вторая использует третью, а третью использует первую.
Кажется, что я могу сделать линт счастливым, объявив все функции перед их определениями, подобными этому.
var foo;
var bar;
foo = function() {
bar();
};
bar = function() {
};
foo();
Вопросов:
- Является ли первый фрагмент кода не работает? Думаю - нет.
- Является первым фрагментом кода, подверженным ошибкам? Думаю, может быть.
- Хорошо ли организовать код, как второй фрагмент (объявить функции перед их определением)?
- Если
yes
Я должен придерживаться этой практики, не так ли? - Если
no
, что является хорошей практикой в отношении этой проблемы? - Является ли это ошибкой linter, заслуживающей внимания, или я должен просто отключить ее?
Вы пробовали переключение позиции '' Foo' и bar' в вашем коде? – Justinas
@ Justinas в этом простейшем сценарии. Я могу просто переместить панель перед foo. Но бывают случаи, когда это просто невозможно. Первая функция вызывает второе, второе - третье, а третье - первое. – Kolyunya
Возможно, насколько я знаю, первый случай очень безопасен по сравнению со вторым. Даже * lint * виноват. Причина в том, что в javascript функции выполняются только тогда, когда все они определены, поэтому у вас есть проблема только в том случае, если * bar() * никогда не будет определен. Во втором случае вы можете выполнить * bar() *, когда он не определен. Просто потому, что вы вызываете * foo() * перед определением * bar() *. Это потому, что во втором случае вы назначаете функции переменным, которые имеют другое поведение ind declare/definition. –