func-style
Требует последовательного использования либо объявлений function, либо выражений, присвоенных переменным
В настоящее время это правило заморожено, и запросы на добавление новых функций не принимаются.
В JavaScript есть два способа определения функций: объявления function и функциональные выражения, присвоенные переменным. Объявления функций — это инструкции, начинающиеся с ключевого слова function. Функциональные выражения могут быть стрелочными функциями или использовать ключевое слово function с необязательным именем. Вот несколько примеров:
// function declaration
function doSomething() {
// ...
}
// arrow function expression assigned to a variable
const doSomethingElse = () => {
// ...
};
// function expression assigned to a variable
const doSomethingAgain = function() {
// ...
};
Основное различие между объявлениями function и функциональными выражениями заключается в том, что объявления поднимаются в начало области видимости, в которой они определены. Это позволяет писать код, использующий функцию до её объявления. Например:
doSomething(); // ok
function doSomething() {
// ...
}
Для функциональных выражений необходимо определить функцию до её использования, иначе произойдёт ошибка. Пример:
doSomething(); // error!
const doSomething = function() {
// ...
};
В этом случае во время вызова doSomething имеет значение undefined, поэтому возникает ошибка времени выполнения.
Из-за различий в поведении обычно устанавливают рекомендации относительно того, какой стиль функций следует использовать. Здесь нет единственно правильного или неправильного выбора — это лишь вопрос предпочтений.
Подробности правила
Это правило требует использовать определённый стиль функций: либо объявления function, либо выражения, присвоенные переменным. Предпочитаемый вариант можно указать в конфигурации.
Примечание: это правило применяется не ко всем функциям. Например, функция обратного вызова, переданная в качестве аргумента другой функции, не учитывается этим правилом.
Параметры
У этого правила есть строковый параметр:
-
"expression"(по умолчанию) требует использовать функциональные выражения вместо объявлений функций -
"declaration"требует использовать объявления функций вместо функциональных выражений
У этого правила есть объектный параметр с двумя исключениями:
-
"allowArrowFunctions":true(по умолчаниюfalse) разрешает использовать стрелочные функции. Этот параметр применяется только при значении строкового параметра"declaration"(стрелочные функции всегда разрешены, если строковый параметр имеет значение"expression", независимо от этого параметра) -
"allowTypeAnnotation":true(по умолчаниюfalse) разрешает использовать функциональные выражения и стрелочные функции, если объявление переменной содержит аннотацию типа, независимо от параметраallowArrowFunctions. Этот параметр применяется только при значении строкового параметра"declaration". (Только TypeScript) -
"overrides":-
"namedExports": "expression" | "declaration" | "ignore": переопределяет стили функций для именованных экспортов-
"expression": как строковый параметр -
"declaration": как строковый параметр -
"ignore": допустим любой стиль
-
-
expression
Примеры неправильного кода для этого правила со значением параметра "expression" по умолчанию:
/*eslint func-style: ["error", "expression"]*/
Примеры правильного кода для этого правила со значением параметра "expression" по умолчанию:
/*eslint func-style: ["error", "expression"]*/
const foo = function() {
// ...
};
const foo1 = () => {};
// allowed as allowArrowFunctions : false is applied only for declaration
Объявления перегруженных функций не считаются ошибками этим правилом. Это функции с несколькими объявлениями под одним именем, но с разными типами параметров или возвращаемыми значениями (обычно используются в TypeScript для предоставления информации о типах при разных способах вызова одной и той же функции).
Примеры правильного кода TypeScript для этого правила со значением параметра "expression" по умолчанию:
/*eslint func-style: ["error", "expression"]*/
function process(value: string): string;
function process(value: number): number;
function process(value: unknown) {
return value;
}
declaration
Примеры неправильного кода для этого правила с параметром "declaration":
/*eslint func-style: ["error", "declaration"]*/
const ;
const ;
Примеры правильного кода для этого правила с параметром "declaration":
/*eslint func-style: ["error", "declaration"]*/
function foo() {
// ...
}
// Methods (functions assigned to objects) are not checked by this rule
SomeObject.foo = function() {
// ...
};
allowArrowFunctions
Примеры дополнительного правильного кода для этого правила с параметрами "declaration", { "allowArrowFunctions": true }:
/*eslint func-style: ["error", "declaration", { "allowArrowFunctions": true }]*/
const foo = () => {};
allowTypeAnnotation
Примеры неправильного кода TypeScript для этого правила с параметрами "declaration", { "allowTypeAnnotation": true }:
/*eslint func-style: ["error", "declaration", { "allowTypeAnnotation": true }]*/
const ;
Примеры правильного кода TypeScript для этого правила с параметрами "declaration", { "allowTypeAnnotation": true }:
/*eslint func-style: ["error", "declaration", { "allowTypeAnnotation": true }]*/
type Fn = () => undefined;
const foo: Fn = function() {};
const bar: Fn = () => {};
overrides
namedExports
expression
Примеры неправильного кода для этого правила с параметрами "declaration" и {"overrides": { "namedExports": "expression" }}:
/*eslint func-style: ["error", "declaration", { "overrides": { "namedExports": "expression" } }]*/
export
Примеры правильного кода для этого правила с параметрами "declaration" и {"overrides": { "namedExports": "expression" }}:
/*eslint func-style: ["error", "declaration", { "overrides": { "namedExports": "expression" } }]*/
export const foo = function() {
// ...
};
export const bar = () => {};
declaration
Примеры неправильного кода для этого правила с параметрами "expression" и {"overrides": { "namedExports": "declaration" }}:
/*eslint func-style: ["error", "expression", { "overrides": { "namedExports": "declaration" } }]*/
export const ;
export const ;
Примеры правильного кода для этого правила с параметрами "expression" и {"overrides": { "namedExports": "declaration" }}:
/*eslint func-style: ["error", "expression", { "overrides": { "namedExports": "declaration" } }]*/
export function foo() {
// ...
}
Примеры правильного кода для этого правила с параметрами "expression" и { "allowTypeAnnotation": true, "overrides": { "namedExports": "declaration" }}:
/*eslint func-style: ["error", "expression", { "allowTypeAnnotation": true, "overrides": { "namedExports": "declaration" } }]*/
export const foo: () => void = function () {}
ignore
Примеры правильного кода для этого правила с параметром {"overrides": { "namedExports": "ignore" }}:
/*eslint func-style: ["error", "expression", { "overrides": { "namedExports": "ignore" } }]*/
export const foo = function() {
// ...
};
export const bar = () => {};
export function baz() {
// ...
}
Когда не следует использовать это правило
Если вы хотите предоставить разработчикам возможность самостоятельно выбирать, как писать функции, это правило можно отключить.
Версия
Это правило появилось в ESLint v0.2.0.
Дополнительная литература
Ресурсы
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/func-style