consistent-function-scoping

March 27, 2026 Β· View on GitHub

πŸ“ Move function definitions to the highest possible scope.

πŸ’ΌπŸš« This rule is enabled in the βœ… recommended config. This rule is disabled in the β˜‘οΈ unopinionated config.

A function definition should be placed as close to the top-level scope as possible without breaking its captured values. This improves readability, directly improves performance and allows JavaScript engines to better optimize performance.

Examples

// ❌
export function doFoo(foo) {
	// Does not capture anything from the scope, can be moved to the outer scope
	function doBar(bar) {
		return bar === 'bar';
	}

	return doBar;
}

function doFoo(foo) {
	const doBar = bar => {
		return bar === 'bar';
	};
}

function doFoo() {
	// Does not capture anything from the scope, can be moved to the outer scope
	return bar => bar === 'bar';
}

// Arrow functions in return statements are now also flagged
export function someAction() {
	return dispatch => dispatch({type: 'SOME_TYPE'});
}
// βœ…
function doBar(bar) {
	return bar === 'bar';
}

export function doFoo(foo) {
	return doBar;
}
// ❌
function doFoo(foo) {
	const doBar = bar => {
		return bar === 'bar';
	};
}

// βœ…
const doBar = bar => {
	return bar === 'bar';
};

function doFoo(foo) {}
// βœ…
export function doFoo(foo) {
	function doBar(bar) {
		return bar === 'bar' && foo.doBar(bar);
	}

	return doBar;
}

const doBar = bar => bar === 'bar';

export function doFoo() {
	return doBar;
}

Options

checkArrowFunctions

Type: boolean
Default: true

Pass "checkArrowFunctions": false to disable linting of arrow functions.

Limitations

This rule does not detect or remove extraneous code blocks inside of functions:

function doFoo(foo) {
	{
		function doBar(bar) {
			return bar;
		}
	}

	return foo;
}

It also ignores functions that contain JSXElement references:

function doFoo(FooComponent) {
	function Bar() {
		return <FooComponent/>;
	}

	return Bar;
};

Immediately invoked function expressions (IIFE) are ignored:

(function () {
	function doFoo(bar) {
		return bar;
	}
})();

Built-in Hooks in React are ignored:

useEffect(() => {
	async function getItems() {}

	getItems();
}, [])