2016-08-10 4 views
12

В моем проекте (только для браузера) Я хочу использовать инструмент качества кода 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, заслуживающей внимания, или я должен просто отключить ее?
+0

Вы пробовали переключение позиции '' Foo' и bar' в вашем коде? – Justinas

+0

@ Justinas в этом простейшем сценарии. Я могу просто переместить панель перед foo. Но бывают случаи, когда это просто невозможно. Первая функция вызывает второе, второе - третье, а третье - первое. – Kolyunya

+0

Возможно, насколько я знаю, первый случай очень безопасен по сравнению со вторым. Даже * lint * виноват. Причина в том, что в javascript функции выполняются только тогда, когда все они определены, поэтому у вас есть проблема только в том случае, если * bar() * никогда не будет определен. Во втором случае вы можете выполнить * bar() *, когда он не определен. Просто потому, что вы вызываете * foo() * перед определением * bar() *. Это потому, что во втором случае вы назначаете функции переменным, которые имеют другое поведение ind declare/definition. –

ответ

2

Нет, фрагменты не сломаны, но и не лучшая практика.

var foo = function(){ 

} 

var bar = function(){ 
    foo(); 
} 

bar(); 

фактически станет:

var foo, bar; 

foo = function(){ 

} 

bar = function(){ 
    foo(); 
} 

bar(); 

Следовательно, вы должны определить все переменные и функции в начале сферы. JavaScript использует Hoisting , который эффективно перемещает все объявления для переменных и функций в верхнюю часть области.

Выполнение самостоятельно считается лучшей практикой и повышает читаемость.

Eslint проверит против правила вары-на-топ, который определен и документально here

https://www.reddit.com/r/learnjavascript/comments/3cq24a/crockford_says_hoisted_variable_declarations_are/ https://www.sitepoint.com/demystifying-javascript-variable-scope-hoisting/

+1

Итак, второй фрагмент кода считается хорошей практикой, верно? – Kolyunya

+0

да точно. По крайней мере, это то, что говорит Крокфорд –

+0

О подъеме, я не эксперт, но в объявлениях переменных js не перемещаются в верхнюю часть области, а только объявления функций. пример: function asd() { console.log ('1 .:' + asdvar); var asdvar = 'sir asdalot'; console.log ('2 .:' + asdvar); } } – kailniris

1
  1. Является ли первый фрагмент кода не работает? нет, это не сломано.
  2. Является первым фрагментом кода, подверженным ошибкам? Нет.
  3. Хорошо ли организовать код, как второй фрагмент (объявить функции перед их определением)? Нет, есть много других хороших способов.
  4. Если да, я должен придерживаться этой практики, не так ли? Да
  5. Если это не хорошая практика в отношении этой проблемы? есть много хорошего шаблона, который вы можете последовать за
  6. Является ли это ошибкой linter, заслуживающей внимания, или я должен просто отключить ее? Приятно обращать внимание на то, чтобы ваш код был чистым.

Всегда используйте строгий режим. "use strict"

есть ли у вас функция внутри сферы, как IIFE для не имеющих переменных Global,

read more about IIFE

function foo() { 
    bar(); 
}; 

function bar() { 

}; 
+0

Объем не является проблемой. Как вы можете видеть в своем редакторе, что размещение объявлений поверх фрагмента решило проблему.Вполне вероятно, что eshint проверен на «vars-on-top» (как указано в моем ответе) –

+0

Я понимаю, но это вопрос выбора из lint, я думаю :-) Я бы предпочел, чтобы у вас не было заранее определенных vars –

 Смежные вопросы

  • Нет связанных вопросов^_^